2013-12-17 11 views
6

FormClosedイベントが発生した後でもフォームが表示されるのはなぜですか?フォームがいつであるかを検出するには、実際にはが閉じられていますか?フォームは閉じられていますが表示されます

enter image description here

興味深い部分は

_form2.VisibleChanged += (s, a) => 
{ 
    if (_form2.Visible == false) 
     MessageBox.Show("TEXT"); 
}; 

は同じ結果につながるということです。

答えて

3

通常の方法でダイアログを閉じますが、通常の方法はフォームのDialogResultプロパティを設定することです。 Winformsはこの場合にFormClosedイベントを合成しますが、間違った時間にそれを行いますが、ウィンドウはまだ表示されます。それは直後に目に見えなくなります。

この場合、回避策が必要な場合は、FormClosedイベントハンドラで何をしたいのかを遅らせることができます。それは、エレガントなこのようなControl.BeginInvoke()メソッドを使用して行われます:

_form2.FormClosed += (s, a) => { 
     this.BeginInvoke(new Action(() => MessageBox.Show("TEXT"))); 
    }; 

そして、あなたが今、メッセージボックスにウィンドウが消え後が表示されます。

コード内のバグに注意して、FormClosedイベントを複数回サブスクライブします。

+0

それは2番目のフォームでのみ動作します。それがApplication.Run(new Form1());によって 'Program'から呼び出されたメインフォームの場合、MessageBoxは表示されません。 [問題についての私の質問](http://stackoverflow.com/questions/28397177/how-to-execute-code-after-the-main-form-has-closed)。 – ispiro

+0

+1。私は何かが足りないと思った。フォームが閉鎖された後にフォーム**クローズ**イベントが発生しないのはなぜですか?そこにあなたのコメントで私はそれがちょうど方法であることを理解した。ありがとう。 – ispiro

2

UIスレッドがスクリーンから実際にフォームを削除するのを防ぐモーダルダイアログを表示しています。

+0

しかし、フォームはどのようにして "_form2.Visible == false"となり同時に画面に表示できますか? – aush

+0

プロパティの状態と画面上に表示される内容が必ずしも一致しないためです。あなたは自分のフォームを隠して閉じるように指示し、プロパティの変更はフォームがあなたが望むものを "理解"し、そうするよう "言う"ことを意味するが、フォームが実際に出るようにウィンドウマネージャが実際にスクリーンを再描画するときその道のりは誰の制御下にもありません。また、 'MessageBox'を表示することで、実際にフォームが視覚的に消える原因となるウィンドウメッセージの流れを実際に中断しています。 –

+0

モーダルフォームが画面から削除される時期を判断する方法はありますか? – aush

関連する問題