2012-04-10 24 views
15

在我的WPF应用程序中,我有时会遇到一个System.Windows.MessageBox。当它最初显示时,它会显示在我的主应用程序窗口的顶部,如我所愿。有没有一种方法可以强制它始终保持在主窗口的顶部?我遇到的问题是,当显示一个MessageBox时,用户可以点击主应用程序窗口并将其置于前面,这意味着MessageBox从视图中隐藏起来。在这种情况下,用户可能没有意识到它存在,或忘记了它,而对于他们来说,主应用似乎已经冻结。强制MessageBox位于.net/WPF中的应用程序窗口之上

我读过一些关于此的线程,但没有人为我解决了这个问题。

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

回答

37

使用版本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,直到它被解除)。

+0

是否有这样做,如果线程搭MessageBox的任何其他方式不是UI线程(拥有主窗口即不是线程)? – 2012-04-10 16:34:41

+0

现在这个信息应该已经出现在初始问题中了 - 我建议现在添加! – Ricibob 2012-04-10 16:36:05

+0

您是否尝试过将MessageBox代码调度到UI线程? – Ricibob 2012-04-10 16:37:20

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); 
    })); 
} 
1

这是一种将消息框放在应用程序窗口之上的快速方法。

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

相关问题