私のWPFアプリでは、時々System.Windows.MessageBox
。最初に表示されたときは、メインアプリケーションウィンドウの上部に表示されています。常にメインウィンドウの上部に留まるように強制する方法はありますか?私が抱えている問題は、MessageBox
が表示されているときに、ユーザーがメインアプリウィンドウをクリックして前面に表示できることです。つまり、MessageBox
が非表示になります。この場合、ユーザーはそれがそこにあることに気付かなかったり、忘れたりする可能性があり、メインのアプリがフリーズしたように見えます。
私はこれについていくつかのスレッドを読みましたが、どれも問題を解決していません。
MessageBox
を作成するスレッドはUIスレッドではない可能性があることを付け加えておきます。ありがとうトム
ウィンドウの「所有者」を取得し、ウィンドウを渡すバージョンの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
がブロックされるまでブロックされます)。
これは、メッセージボックスをアプリケーションウィンドウの上にすばやく配置する方法です。
MessageBox.Show(this ,"Output text"));
あなたの「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);
}));
}