2013-10-04 7 views
6

私は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(); 
      //} 
     }; 
    } 
} 

答えて

3

がownerlessにフォームを閉じるには、メインフォームのFormClosingハンドラにイベントハンドラを追加します:

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

このようになります

次のコードは、問題を示しています彼らは優雅に閉鎖されており、メインスレッドの終了を待たずに終了イベントを実行し、これらのフォームを正常に閉じることなくプロセスを解体するようにします。

+0

おかげさまで、本当にありがとうございます。赤いX exitが実質的に所有者のないフォームの強制終了であることを知っています。 – jlmt

+0

@jlmtメインフォームを閉じると、アプリケーションのメッセージループが終了し、終了すると 'Main'メソッドが終了し、終了すると、最後に残ったフォアグラウンドスレッドが終了します。それが起こると、プロセス全体が解体されます。問題は、他のフォームに送信される緊急メッセージがないことです。このコードはそれを変更します。 – Servy

関連する問題