强制MessageBox位于.net / WPF中的应用程序窗口之上

时间:2012-04-10 16:21:49

标签: wpf .net-4.0 modal-dialog messagebox

在我的WPF应用中,我有时会出现System.Windows.MessageBox。当它最初显示时,它会显示在我的主应用程序窗口的顶部,如我所愿。有没有办法可以强迫它始终保持在主窗口的顶部?我遇到的问题是,当显示MessageBox时,用户可以单击主应用程序窗口并将其置于前面,这意味着MessageBox将从视图中隐藏。在这种情况下,用户可能没有意识到它在那里,或者忘了它,对他们来说,主应用程序似乎已经冻结了。

我已经阅读了很多有关此问题的帖子,但没有人为我解决过这个问题。

我应该补充说,提出MessageBox的线程可能不是UI线程。 谢谢 汤姆

3 个答案:

答案 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);
    }));
}