通常,让您的应用程序执行默认操作以外的其他操作(打开表单,等待它关闭,然后退出)的正确方法是创建一个继承自ApplicationContext
. 然后你将你的类的一个实例传递给该Application.Run
方法。当应用程序应该关闭时,请ExitThread()
从您的班级中调用。
在这种情况下,您可以在应用程序加载时创建三个表单的实例,并为它们的Closed
事件注册一个处理程序。当每个表单关闭时,处理程序将检查是否还有其他表单仍然打开,如果没有则关闭应用程序。
MSDN上的示例做了两件事:
- 打开多个表单并在它们全部关闭时退出应用程序
- 关闭每个表单时保存表单的最后大小和位置。
一个更简单的示例,仅在关闭所有表单后关闭应用程序:
class MyApplicationContext : ApplicationContext {
private void onFormClosed(object sender, EventArgs e) {
if (Application.OpenForms.Count == 0) {
ExitThread();
}
}
public MyApplicationContext() {
//If WinForms exposed a global event that fires whenever a new Form is created,
//we could use that event to register for the form's `FormClosed` event.
//Without such a global event, we have to register each Form when it is created
//This means that any forms created outside of the ApplicationContext will not prevent the
//application close.
var forms = new List<Form>() {
new Form1(),
new Form2(),
new Form3()
};
foreach (var form in forms) {
form.FormClosed += onFormClosed;
}
//to show all the forms on start
//can be included in the previous foreach
foreach (var form in forms) {
form.Show();
}
//to show only the first form on start
//forms[0].Show();
}
}
然后,您的Program
课程如下所示:
static class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyApplicationContext());
}
}
应用程序关闭逻辑显然可以自定义 - 任何表单仍然打开,或者只有这三种类型中的一种,或者只有前三个实例(这需要持有对前三个实例的引用,可能在 a 中List<Form>
)。
回复:每个表单创建的全局事件——这看起来很有希望。
这里有一个类似的例子。