web-dev-qa-db-ja.com

MessageBoxを.net / WPFのアプリケーションウィンドウの上に配置する

私のWPFアプリでは、時々System.Windows.MessageBox。最初に表示されたときは、メインアプリケーションウィンドウの上部に表示されています。常にメインウィンドウの上部に留まるように強制する方法はありますか?私が抱えている問題は、MessageBoxが表示されているときに、ユーザーがメインアプリウィンドウをクリックして前面に表示できることです。つまり、MessageBoxが非表示になります。この場合、ユーザーはそれがそこにあることに気付かなかったり、忘れたりする可能性があり、メインのアプリがフリーズしたように見えます。

私はこれについていくつかのスレッドを読みましたが、どれも問題を解決していません。

MessageBoxを作成するスレッドはUIスレッドではない可能性があることを付け加えておきます。ありがとうトム

18
Tom Davies

ウィンドウの「所有者」を取得し、ウィンドウを渡すバージョンのMessageBox.Showを使用します。

MessageBox.Show(Application.Current.MainWindow, "Im always on top - of the main window");

UIスレッドにない可能性がある場合は、以下を試してください。

string msg="Hello!";
if (Application.Current.Dispatcher.CheckAccess()) {
    MessageBox.Show(Application.Current.MainWindow, msg);
}
else {
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>{
        MessageBox.Show(Application.Current.MainWindow, msg);
    }));
}

あなたはできる:
1。 Invokeが終了するまでスレッドをブロックするにはMessageBoxまたは
2。 BeginInvokeの場合、スレッドコードは引き続き実行されますが、UIスレッドはMessageBoxがブロックされるまでブロックされます)。

47
Ricibob

これは、メッセージボックスをアプリケーションウィンドウの上にすばやく配置する方法です。

MessageBox.Show(this ,"Output text"));

1
juni-j

あなたの「public partial class MainWindow : Window "次のコードを配置します。したがって、InvokeはUIスレッド内でコードを実行します。

void ShowErrorMessage(ERROR err)
{
    this.Dispatcher.Invoke((Action)(() =>
    {
        MessageBox.Show(err.description, err.code.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
    }));
}
0
GMG