力的MessageBox是在.NET / WPF应用程序窗口的顶部(Force MessageBox

2019-06-23 12:40发布

在我的WPF应用程序,我有时是一个System.Windows.MessageBox 。 当最初显示,它会显示在我的应用程序主窗口之上,如我所愿。 有没有一种方法,我可以迫使它一直保持在主窗口的顶部? 我的问题是,当MessageBox显示,用户可以单击主窗口的应用程序并将其置于前端,这意味着MessageBox变为隐藏的。 在这种情况下,用户可能没有意识到它的存在,或者忘掉它,而对他们来说,主要的应用程序似乎已经冻结。

我读过一些关于这个主题的,但没有解决这个问题对我来说。

我应该补充的是,线搭MessageBox可能不是UI线程。 感谢汤姆

Answer 1:

使用的版本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直到其解雇)。



Answer 2:

这是把消息框上的应用程序窗口上方的快捷方式。

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



Answer 3:

里面你的“ public partial class MainWindow : Window ”将下面的代码。 因此,调用将运行UI线程内的代码。

void ShowErrorMessage(ERROR err)
{
    this.Dispatcher.Invoke((Action)(() =>
    {
        MessageBox.Show(err.description, err.code.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);
    }));
}


文章来源: Force MessageBox to be on top of application window in .net/WPF