私はFormClosingイベント中にそれぞれのペインレイアウトを保存するいくつかのフォームを持つ小さなアプリケーションを持っています。赤いX出口でオーナーレスフォームのFormClosingを消すには?
メインフォームが最小化されている場合、フォームには何かを残す必要があるため、form.Show(this)
ではなく、form.Show()
でオーナーなしに開いています。
ただし、これはFormClosing
の動作に影響します。ユーザーが赤いXを使用して終了すると、FormClosing
イベントはオーナーなしのフォームでは発生しません。
Application.Exit()
は、メインフォームのFormClosing
イベントをキャンセルしてApplication.Exit()を呼び出すと、代わりにFormClosing
がownerlessフォーム以外のものに対して2回呼び出されます。
メインフォームのFormClosingイベントでOpenFormsを繰り返し実行し、保存が必要なものを保存することができますが、これは少しハックしたようです。 Application.Exit()と同じ方法でXを動作させる方法はありますか?メインフォームが閉じているとき
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 exitが実質的に所有者のないフォームの強制終了であることを知っています。 – jlmt
@jlmtメインフォームを閉じると、アプリケーションのメッセージループが終了し、終了すると 'Main'メソッドが終了し、終了すると、最後に残ったフォアグラウンドスレッドが終了します。それが起こると、プロセス全体が解体されます。問題は、他のフォームに送信される緊急メッセージがないことです。このコードはそれを変更します。 – Servy