21

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

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

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

4

3 に答える 3

55

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破棄されるまでブロックされます)。

于 2012-04-10T16:27:59.563 に答える
1

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

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

于 2015-12-10T13:20:18.400 に答える
0

" " 内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);
    }));
}
于 2014-02-27T17:02:03.543 に答える