2012-04-10 2 views
15

In meiner WPF-App bin ich manchmal ein System.Windows.MessageBox. Wenn es anfänglich angezeigt wird, wird es über meinem Hauptanwendungsfenster angezeigt, wie ich es möchte. Gibt es einen Weg, dass ich es zwingen kann, immer oben im Hauptfenster zu bleiben? Das Problem, das ich habe, ist, dass, wenn ein MessageBox angezeigt wird, Nutzer dann auf das Haupt-App-Fenster klicken und es nach vorne bringen können, was bedeutet, dass die MessageBox aus der Sicht ausgeblendet wird. In diesem Fall merkt der Benutzer möglicherweise nicht, dass er da ist, oder vergisst ihn, und für sie scheint die Haupt-App eingefroren zu sein.Erzwingen Sie, dass MessageBox über dem Anwendungsfenster in .net/WPF ist

Ich habe eine Reihe von Threads darüber gelesen, aber keine haben das Problem für mich gelöst.

Ich sollte hinzufügen, dass der Thread MessageBox nicht der UI-Thread sein kann. Danke Tom

Antwort

37

Verwenden Sie die Version MessageBox.Show, die ein Fenster "Besitzer" nimmt und Ihr Fenster übergeben.

MessageBox.Show(Application.Current.MainWindow, "Im always on top - of the main window"); 

Wenn Ihr möglicherweise nicht auf dem UI-Thread versuchen:

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

Sie können:
1. Invoke Thread zu blockieren, bis MessageBox des Feldes verwiesen OR
2. BeginInvoke, in dem Fall, dass Ihr Thread-Code wird weiterhin ausgeführt, aber UI-Thread wird auf MessageBox blockiert, bis es entlassen wird).

+0

Gibt es eine andere Möglichkeit, dies zu tun, wenn der Faden die MessageBox Aufstellen ist nicht der UI-Thread (dh nicht der Thread, der die Mainwindow besitzt)? –

+0

Ah, jetzt sollte die Info in die Anfangsfrage gegangen sein - ich schlage vor, es jetzt hinzuzufügen! – Ricibob

+0

Haben Sie versucht, den MessageBox-Code an den UI-Thread zu senden? – Ricibob

0

Geben Sie in Ihrem "public partial class MainWindow : Window" den folgenden Code ein. Der Invoke wird also Ihren Code im UI-Thread ausführen.

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

Dies ist eine schnelle Möglichkeit, die Message Box über die Anwendungsfenster zu setzen.

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

Verwandte Themen