在我的WPF应用中,我有时会出现System.Windows.MessageBox
。当它最初显示时,它会显示在我的主应用程序窗口的顶部,如我所愿。有没有办法可以强迫它始终保持在主窗口的顶部?我遇到的问题是,当显示MessageBox
时,用户可以单击主应用程序窗口并将其置于前面,这意味着MessageBox
将从视图中隐藏。在这种情况下,用户可能没有意识到它在那里,或者忘了它,对他们来说,主应用程序似乎已经冻结了。
我已经阅读了很多有关此问题的帖子,但没有人为我解决过这个问题。
我应该补充说,提出MessageBox
的线程可能不是UI线程。
谢谢
汤姆
答案 0 :(得分:44)
使用带有“所有者”窗口的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
上阻塞,直到其被解雇)。
答案 1 :(得分:1)
这是将消息框置于应用程序窗口之上的快速方法。
MessageBox.Show(this ,"Output text"));
答案 2 :(得分: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);
}));
}