21

在我的 WPF 应用程序中,我有时会启动System.Windows.MessageBox. 当它最初显示时,它会显示在我的主应用程序窗口的顶部,就像我想要的那样。有没有办法可以强制它始终保持在主窗口的顶部?我遇到的问题是,当MessageBox显示 a 时,用户可以单击主应用程序窗口并将其带到前面,这意味着它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 回答