4

現在ユーザー テスト中のクライアント アプリケーションで未処理の例外をキャッチするときに、次のようなコードを作成しました。

catch(Exception ex)
{
    var result = MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
    Current.Shutdown();
}

しかし、メッセージ ボックスがすぐに表示され、プログラムがシャットダウンします。コードが結果が明らかになるのを待たないのはなぜですか。どうすればいいですか?

4

5 に答える 5

6

同様の問題がありました。問題は、メイン ウィンドウが表示される前に例外がスローされるため、メッセージ ボックスを表示するウィンドウがないことです。Swamy の回答は、ウィンドウを初期化できるように時間の遅延を強制しただけです。IMOはあまりにもエレガントではありません。より良い解決策を見つけました [こちら] WPF MessageBox が結果を待っていません [WPF NotifyIcon]

でを指定するだけMessageBoxOptions.DefaultDesktopOnlyですMessageBox.Show(....) method

于 2015-10-02T09:46:49.727 に答える
3

ドキュメントからMessageBoxクラスへ:

メッセージ ボックスには常にオーナー ウィンドウがあります。既定では、メッセージ ボックスの所有者は、メッセージ ボックスが開かれた時点でアプリケーションで現在アクティブなウィンドウです。Windowただし、複数のオーバーロードのいずれかを使用して、の別の所有者を指定できますShow。オーナー ウィンドウの詳細については、 を参照してくださいWindow.Owner

したがって、あなたの問題は、メッセージボックスがユーザーによって閉じられる前にアプリケーションが存在するこの質問に非常に似ています。

最初に試すことは、パラメーターnullとして渡すことです。Window

MessageBox.Show(null, ex.Message, "Error", MessageBoxButton.OK);

メインウィンドウオブジェクトなど、クラスのインスタンスがある場合は、Window代わりにそれを渡しますnull

MessageBox.Show(mainWindow, ex.Message, "Error", MessageBoxButton.OK);

現在メイン ウィンドウ メソッドのいずれかを使用している場合はthis、Window として渡すことができます。

MessageBox.Show(this, ex.Message, "Error", MessageBoxButton.OK);

null現時点で使用可能なメイン ウィンドウ オブジェクトがない場合にのみ使用します。

MessageBox サンプルを見てください。thisがオーナー ウィンドウとして渡される場合と渡される場合の違いを確認できるはずですnull

于 2012-08-21T19:55:09.647 に答える
1

このコードをスクリプトまたは実際の .net アプリケーション内で使用していますか? メッセージ ボックス ボタンに「s」がありません。次のようなコードを書く必要があります。

try
{
    throw new Exception("My new exception");
}
catch (Exception ex)
{
    DialogResult result = MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK);
} 

これが機能しない場合は、さらにデバッグするために例外をスローするコードを確認する必要があります...

于 2012-08-21T17:47:11.920 に答える
0

これは非常に古い質問ですが、おそらく以下の回答が他の人に役立つかもしれません。

メイン ウィンドウが作成される前にメッセージ ボックスを表示したいという同じ状況がありました。私の場合も、[OK] をクリックするとアプリケーションがシャットダウンする前にメッセージ ボックスが消えていました。

私は async を使用して awaits を使用しており、10 ミリ秒の遅延を追加することで問題が修正されました (その時点でメイン ウィンドウが読み込まれるため)。

await Task.Delay(10);
if (MessageBox.Show(MainWindow, "Message", "Error", MessageBoxButton.OK) == MessageBoxResult.OK)
{
    Current.Shutdown();
}

おそらく非非同期メソッドの場合、 Thread.Sleep も機能する可能性があります(試していません)。

于 2015-01-08T11:43:13.440 に答える