c# - Windows 窗体程序中的多个 UI

标签 c# winforms

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

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

FormClosedEventHandler(subFormClosed);

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

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

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

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

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

我试图使用 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

关于c# - Windows 窗体程序中的多个 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33766836/

相关文章:

c# - 将两个或多个工具窗口添加到同一个 Visual Studio 项目中

c# - 现有项目中的实体类型未标记为虚拟

c# - 获取动态创建的文本框的值

C# WinForm 在安装时设置 ConnectionString 和 Entity Framework

c# - 隐藏 TableLayoutPanel 中两个组合单元格之间的边框

c# - 从文件加载列表框

c# - 使用 OpenFileDialog 作为目录,而不是 FolderBrowserDialog

c# - C# 中的 PrintableArea - 错误?

c# - 如何从 C# 读取数组列表并将其写入 javascript 对象

c# - 通用构造函数和继承