gpt4 book ai didi

c# - 如何在红色 X 退出时为无主表单触发 FormClosing?

转载 作者:太空狗 更新时间:2023-10-29 21:50:30 25 4
gpt4 key购买 nike

我有一个包含多个表单的小应用程序,每个表单都会在 FormClosing 事件期间保存它们的 Pane 布局。

当主窗体最小化时,一些窗体需要保留在屏幕上,所以它们是用 form.Show() 打开的,而不是 form.Show(this).

但是,这会影响 FormClosing 行为 - 当用户使用红色 X 退出时,FormClosing 事件不会为无主表单触发。

Application.Exit() 会按需工作,但取消主窗体中的 FormClosing 事件并调用 Application.Exit() 会导致 FormClosing 在除无主表单之外的所有内容上被调用两次。

我可能可以在主窗体的 FormClosing 事件中迭代 OpenForms 并保存任何需要保存的内容,但这似乎有点麻烦。有没有办法让 X 的行为方式与 Application.Exit() 相同?

下面的代码演示了这个问题:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

this.Text = "Main";

Form ownedForm = new Form { Text = "Owned" };
ownedForm.FormClosing += (s, e) => { System.Diagnostics.Debug.WriteLine("FormClosing owned form"); };
ownedForm.Show(this);

Form ownerlessForm = new Form { Text = "Ownerless" };
ownerlessForm.FormClosing += (s, e) => { System.Diagnostics.Debug.WriteLine("FormClosing ownerless form"); };
ownerlessForm.Show();

this.FormClosing += (s, e) =>
{
System.Diagnostics.Debug.WriteLine("FormClosing main form");

// fix below doesn't work as needed!
//if (e.CloseReason == CloseReason.UserClosing)
//{
// e.Cancel = true;
// Application.Exit();
//}
};
}
}

最佳答案

在主窗体的 FormClosing 处理程序中添加一个事件处理程序,以便在主窗体关闭时关闭无主窗体:

ownerlessForm.Show(); //right after this line that you already have
FormClosing += (s, e) => ownerlessForm.Close(); //add this

这将确保它们正常关闭,并运行它们的关闭事件,而不是让主线程结束并在不让这些表单正常关闭的情况下拆除进程。

关于c# - 如何在红色 X 退出时为无主表单触发 FormClosing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com