打开子窗口的主窗体按钮的处理程序。
private void button1_Click(object sender, EventArgs e)
{
Form2 mainForm = new Form2(this); // передаю управление дочерней форме
mainForm.ShowDialog();
}
子窗体构造函数
public Form2(Form1 f)
{
InitializeComponent();
f.Close();
}
结果,当子项打开时,两个表单都关闭。
如果您在 Visual Studio 中创建一个新的 WinForms 项目并查看 Program.cs 文件中的代码,您可以看到应用程序已启动并带有以下行:
此代码隐式创建一个新的ApplicationContext实例,该实例订阅提交表单上的FormClosed事件。当事件发生时
FormClosed,ApplicationContext调用Application.ExitThread方法,该方法关闭所有窗口并终止应用程序。您可以创建自己的 ApplicationContext,它允许您根据需要管理应用程序的生命周期。例如,这样的应用程序永远不会自行终止,它需要从任务管理器中终止。
要在且仅在最近的表单关闭时终止应用程序,您可以使用Application.OpenForms属性检查是否至少打开了一个表单。
现在主要的只是确保用户有机会关闭所有表单。我们不能让最后一个表单在右上角没有按钮,并且不处理 Alt + F4。
但是,如果您将上述方法应用于您的示例,它仍然不起作用。
您在孩子的构造函数中关闭调用表单。此时子窗体还没有打开,
Application.OpenForms会为空,导致应用程序终止。您可以将关闭调用表单的代码移动到
OnShown.并且更容易使调用表单自行关闭。
ShowDialog方法打开一个模式窗口。它取决于父窗口,并随之关闭。如果调用窗体是当前打开的唯一窗口,它会自动成为
Form2. 要断开与调用表单的链接,请Form2使用Show方法显示。奖金
在这种情况下,您可能不希望最初显示的表单在关闭后仍保留在内存中。但是,
Form1这是一个方法局部变量Main。对的引用Form1将保留在堆栈中,直到应用程序终止。为了不创建局部变量,您可以更改 MyApplicationContext,使其自动在其构造函数中创建第一个表单。例如,传递给构造函数的不是表单的实例,而是对该实例可以创建的方法的引用。
附言
这取决于您的应用程序是如何启动的。如果您的应用程序只是等待主窗体关闭,那么当您关闭它时,应用程序将退出,并且所有其他窗体都将关闭。
关闭主窗体有什么意义?你打算再回到她身边吗?
如果你仍然需要从屏幕上移除主窗体,你可以隐藏它,例如,像这样
好吧,例如,如果在关闭子窗体后,您需要再次显示主窗体