Windows窗体程序中的多个UI

本文关键字:UI 窗体 程序 Windows | 更新日期: 2023-09-27 18:22:14

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

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

FormClosedEventHandler(subFormClosed);

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

因此,这样做的目的是当用户关闭子窗体时关闭它。

然而,有一个问题,我想回到菜单,问题是我有两种可能性之一,我可以看到:

  1. 我可以通过引用将菜单表单传递给子表单,然后显示和隐藏子表单——这似乎是一种非常笨拙的方法,但它确实有效。

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

我试图使用CloseReason来检查子窗体是由用户关闭的,还是从代码中关闭的,但是退出按钮和this.Close()都返回CloseReason.UserClosing。因此,我无法区分这两种退出方式。

所以基本上,我所要求的是有一种更好的方法来做到这一点,我读过关于MDI和SDI的文章,但我真的不知道哪一种适用,或者笨拙的选项1是否是最好的方法。

Windows窗体程序中的多个UI

您可以使用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

尽管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(),并以您想要的方式关闭它们:事件将相应地被触发。