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();
}
因此,这样做的目的是当用户关闭子窗体时关闭它。
然而,有一个问题,我想回到菜单,问题是我有两种可能性之一,我可以看到:
我可以通过引用将菜单表单传递给子表单,然后显示和隐藏子表单——这似乎是一种非常笨拙的方法,但它确实有效。
我可以打开一个新版本的菜单表单-这将导致过度使用时的巨大内存问题(创建更多的实例,然后在程序关闭之前永远不会销毁,例如30个菜单表单子表单)
我试图使用CloseReason来检查子窗体是由用户关闭的,还是从代码中关闭的,但是退出按钮和this.Close()
都返回CloseReason.UserClosing
。因此,我无法区分这两种退出方式。
所以基本上,我所要求的是有一种更好的方法来做到这一点,我读过关于MDI和SDI的文章,但我真的不知道哪一种适用,或者笨拙的选项1是否是最好的方法。
您可以使用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,这里还有另一种方法:
在菜单窗体的构造函数中,以这种方式使用子窗体的FormClosed
和Shown
事件:
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(),并以您想要的方式关闭它们:事件将相应地被触发。