フォームが閉じる前にメッセージボックスが表示されるのはなぜですか?
SomeForm myForm = new SomeForm();
myForm.Show();
MessageBox.Show("Some text");
新しいスレッドを開始して、終了するのを待つ必要がありますか?私はこれまでこの問題に遭遇したことがありません。
代わりにForm.ShowDialog()を使用する必要があります。Form.Showはモードレスウィンドウを表示しますが、Form.ShowDialogはモーダルフォームを表示します。つまり、ユーザーが続行する前に閉じる必要があります。
あなたの例は実際に閉じることはありませんmyForm
...それを示すだけです。myForm
上記のコードが表示され、すぐにが表示されることを期待しますMessageBox
。
メッセージボックスを表示する前に閉じたい場合は、ある時点でmyForm
呼び出す必要があります。myForm.Close()
これはmyForm.Show();
、新しいウィンドウのオープンを開始するためですが、ブロッキング呼び出しではありません。これはダイアログではなく、独自に実行される別のウィンドウです。
SomeFormをダイアログとして表示する場合(ウィンドウをブロックし、閉じるまで待機して実行を続行します)、を使用しますShowDialog
。メッセージボックスを表示する前にウィンドウが開くまで待ちたい場合は、SomeFormクラスのOnLoadedにメッセージボックスを追加します。
この他のフォームが表示されている間、ユーザーがメインフォームを操作できないことが重要な場合は、のmyForm.ShowDialog
代わりにを使用できますShow
。 ShowDialog
はブロッキング関数であるため、他のフォームが閉じられるまで戻りません。 Show
一方、は、他のフォームを表示するだけで、フォームが閉じられるのを待たずにすぐに戻ります。
他のフォームがモーダルで表示されないことが意図されていて、その変更を行わない(またはできない)場合は、イベントを使用して、他のフォームが閉じられたときにメッセージボックスを表示できます。
SomeForm myForm = new SomeForm();
myForm.FormClosed += (form, args) =>
{
MessageBox.Show("Some text");
};
myForm.Show();
これにより、他のフォームが閉じられたときに起動するイベントハンドラーが追加され、適切なタイミングで目的のコードが実行されます。