FormClosing イベント中にそれぞれのペイン レイアウトを保存するいくつかのフォームを持つ小さなアプリがあります。
一部のフォームは、メイン フォームが最小化されているときに画面上に残す必要があるため、 ではなく で所有者なしで開かform.Show()
れform.Show(this)
ます。
ただし、これはFormClosing
動作に影響します。ユーザーが赤い X を使用して終了するFormClosing
と、所有者のないフォームに対してイベントが発生しません。
Application.Exit()
は必要に応じて機能しますが、メイン フォームでイベントをキャンセルしてFormClosing
Application.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();
//}
};
}
}