如何在红色 X 出口处为无所有者表单触发 FormClose

本文关键字:表单 所有者 FormClose 红色 出口处 | 更新日期: 2023-09-27 18:33:53

我有一个包含多个窗体的小应用程序,每个窗体在 FormClosing 事件期间保存其窗格布局。

当主表单

最小化时,某些表单需要保留在屏幕上,因此它们以无主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();
            //}
        };
    }
}

如何在红色 X 出口处为无所有者表单触发 FormClose

将事件处理程序添加到主窗体的FormClosing处理程序,以便在主窗体关闭时关闭无所有者窗体:

ownerlessForm.Show(); //right after this line that you already have
FormClosing += (s, e) => ownerlessForm.Close(); //add this
这将确保它们正常关闭,并

运行其关闭事件,而不是让主线程结束并删除进程,而不让这些窗体正常关闭。