Windows窗体程序中的多个UI

时间:2015-11-17 20:56:36

标签: c# winforms

我有一个窗口表单项目,我有一个登录屏幕,一个菜单和其他几种表单,我在它们之间切换:

this.Hide();
frm.FormClosed += new FormClosedEventHandler(subFormClosed);
frm.Show();

FormClosedEventHandler(subFormClosed);

private void subFormClosed(object sender, FormClosedEventArgs e)
{
    this.Close();
}

所以这样做的目的是当用户关闭子窗体时关闭它。

但是有一个问题,我想回到菜单,问题是我有两种可能性中的一种,我可以看到:

  1. 我可以通过引用将菜单表单传递给subForm,然后显示它并隐藏子表单 - 这似乎是一种非常好的方式,但它可以工作。

  2. 我可以打开菜单表单的新版本 - 这会在过度使用时导致巨大的内存问题(更多实例被创建,然后在程序关闭之前永远不会被销毁,例如30个菜单表单子表单)< / p>

  3. 我试图使用CloseReason检查子表单是否已被用户关闭,或者是否已从代码中关闭,但退出按钮和this.Close()都返回CloseReason.UserClosing。因此,我无法区分两种类型的退出。

    所以基本上我要求的是有更好的方法来做到这一点,我已经读过有关MDI和SDI的内容,而且我无法确定哪些适用,或者如果kludgy选项1是这样做的最佳方式。

2 个答案:

答案 0 :(得分:2)

您可以使用ShowDialog并将菜单页面作为所有者传递。像这样:

在菜单中

// on menu navigation button click
this.hide();
SubForm sub = new SubForm();
sub.ShowDialog(this);   // open as a dialog with this form as the owner

在子表格中

// on subform's back button click or better, in the FormClosing event
this.Owner.show();
this.Close();    // this line is not needed if implemented in FormClosing event

答案 1 :(得分:1)

虽然ShowDialog解决方案的答案是非常好的,但如果由于某种原因不想使用ShowDialog,这是另一种方法:

在菜单表单的构造函数中,以这种方式使用子表单的FormClosedShown事件:

subForm1.FormClosed += (s, e) => showMenu();
subForm1.Shown+= (s, e) => hideMenu();

subForm2.FormClosed += (s, e) => showMenu();
subForm2.Shown+= (s, e) => hideMenu();
...

void showMenu()
{
    this.Show();
}

void hideMenu()
{
    this.Hide();
}

然后你可以自由地使用subForm1.Show()并按照你想要的方式关闭它们:事件将被相应地触发。