6

FormClosing イベント中にそれぞれのペイン レイアウトを保存するいくつかのフォームを持つ小さなアプリがあります。

一部のフォームは、メイン フォームが最小化されているときに画面上に残す必要があるため、 ではなく で所有者なしで開かform.Show()form.Show(this)ます。

ただし、これはFormClosing動作に影響します。ユーザーが赤い X を使用して終了するFormClosingと、所有者のないフォームに対してイベントが発生しません。

Application.Exit()は必要に応じて機能しますが、メイン フォームでイベントをキャンセルしてFormClosingApplication.Exit() を呼び出すと、代わりFormClosingにオーナーのないフォーム以外のすべてで が 2 回呼び出されます。

おそらく、メイン フォームの 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();
            //}
        };
    }
}
4

1 に答える 1

3

メイン フォームのハンドラーにイベント ハンドラーを追加してFormClosing、メイン フォームが閉じられたときにオーナーのないフォームを閉じます。

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

これにより、これらのフォームが正常に閉じられることが保証され、フォームを正常に閉じずにメイン スレッドが終了してプロセスが破棄されるのではなく、終了イベントが実行されます。

于 2013-10-04T17:27:03.747 に答える