2012-04-10 16 views
15

W mojej aplikacji WPF czasami znajduję się na poziomie System.Windows.MessageBox. Kiedy jest wyświetlany początkowo, jest wyświetlany na górze okna głównego aplikacji, tak jak chciałbym. Czy istnieje sposób, aby zmusić go do ZAWSZE pozostania na szczycie głównego okna? Problem polega na tym, że po wyświetleniu MessageBox użytkownicy mogą kliknąć główne okno aplikacji i przesunąć je na wierzch, co oznacza, że ​​MessageBox zostaje ukryty. W takim przypadku użytkownik może nie zdawać sobie z tego sprawy lub zapomnieć o nim, a dla nich główna aplikacja wydaje się być zamrożona.Wymusza, aby MessageBox znajdował się w górnej części okna aplikacji w .net/WPF

Przeczytałem wiele wątków na ten temat, ale żaden nie rozwiązał problemu dla mnie.

Należy dodać, że wątek wstawiający MessageBox może nie być wątkiem interfejsu użytkownika. Dzięki Tom

Odpowiedz

37

Użyj wersji MessageBox.Show, która bierze "właściciela" okna i przekazuje okno.

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

Jeśli urządzenie może nie na próbie wątku 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); 
    })); 
} 

Można:
1. Invoke aby zablokować wątek aż MessageBox jest odwołany lub
2. BeginInvoke w którym to przypadku kod wątku będzie nadal wykonywany, ale wątek interfejsu użytkownika będzie blokował się na MessageBox, dopóki nie zostanie odrzucony).

+0

Czy jest jakiś inny sposób to zrobić, jeśli wątek stawiania MessageBox nie jest wątek UI (czyli nie jest wątek, który jest właścicielem MainWindow)? –

+0

Ah teraz, że informacja powinna była znaleźć się w głównym pytaniu - proponuję dodać teraz! – Ricibob

+0

Czy próbowałeś Wysłanie kodu MessageBox do wątku interfejsu użytkownika? – Ricibob

0

Wewnątrz swojego "public partial class MainWindow : Window" umieść następujący kod. Więc Invoke uruchomi twój kod wewnątrz wątku UI.

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

Jest to szybki sposób umieszczania wiadomości w górnej części okien aplikacji.

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

Powiązane problemy