2012-04-10 2 views
15

Nella mia app WPF, a volte mi trovo su uno System.Windows.MessageBox. Quando viene visualizzato inizialmente, viene visualizzato nella parte superiore della finestra principale dell'applicazione, come vorrei. C'è un modo in cui posso forzarlo a SEMPRE rimanere in cima alla finestra principale? Il problema è che quando viene visualizzato un MessageBox, gli utenti possono fare clic sulla finestra principale dell'applicazione e portarlo in primo piano, ovvero lo MessageBox diventa nascosto alla vista. In questo caso l'utente potrebbe non rendersi conto che è lì, o dimenticarsene, e per loro, l'app principale sembra essersi congelata.Force MessageBox in cima alla finestra dell'applicazione in .net/WPF

Ho letto un numero di thread su questo, ma nessuno ha risolto il problema per me.

Devo aggiungere che il thread che inserisce il MessageBox potrebbe non essere il thread dell'interfaccia utente. Grazie Tom

risposta

37

Utilizzare la versione di MessageBox.Show che accetta un "proprietario" Finestra e passa la finestra.

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

Se il possibilmente non sul thread UI prova:

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

È possibile:
1. Invoke per bloccare il tuo thread fino MessageBox è respinto O
2. BeginInvoke nel qual caso tuo il codice del thread continuerà a essere eseguito, ma il thread dell'interfaccia utente verrà bloccato su MessageBox fino alla sua rimozione).

+0

C'è un altro modo di fare questo se il filo mettendo su MessageBox non è il thread dell'interfaccia utente (cioè non il filo che possiede il MainWindow)? –

+0

Ah, ora che le informazioni dovrebbero essere passate nella domanda iniziale, suggerisco di aggiungerle ora! – Ricibob

+0

Hai provato a inviare il codice MessageBox al thread dell'interfaccia utente? – Ricibob

0

All'interno del codice "public partial class MainWindow : Window" inserire il seguente codice. Quindi Invoke eseguirà il tuo codice all'interno del thread dell'interfaccia utente.

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

Questo è un modo rapido per posizionare la finestra di messaggio sopra le finestre dell'applicazione.

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