C# 如何在红色X出口为无主窗体关闭窗体?

C# 如何在红色X出口为无主窗体关闭窗体?,c#,winforms,C#,Winforms,我有一个包含多个表单的小应用程序,每个表单在表单关闭事件期间保存其窗格布局 当主窗体最小化时,某些窗体需要保留在屏幕上,因此它们是用form.Show()无主打开的,而不是form.Show(this) 但是,这会影响FormClosing行为-当用户使用红色X退出时,无所有者表单不会触发FormClosing事件 Application.Exit()会根据需要工作,但是取消主窗体中的FormClosing事件并调用Application.Exit()会导致对除无所有者窗体之外的所有窗体调用两次

我有一个包含多个表单的小应用程序,每个表单在表单关闭事件期间保存其窗格布局

当主窗体最小化时,某些窗体需要保留在屏幕上,因此它们是用
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

这将确保它们优雅地关闭,并运行其关闭事件,而不是让主线程结束并在不让这些窗体优雅地关闭的情况下拆除进程。

回答得很好,谢谢-知道红色X退出实际上是无主窗体的强制退出后,一切都变得更加清晰。@jlmt,更有效地关闭主窗体意味着应用程序的消息循环结束,当消息循环结束时,
main
方法结束,当消息循环结束时,最后剩余的前台线程结束。当这种情况发生时,整个过程都被破坏了。问题是,在任何情况下,都没有向其他形式发送关闭消息;这段代码改变了这一点。