2012-04-10 23 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"));

相關問題