2012-04-10 10 views
15

En mi aplicación WPF, a veces estoy en un System.Windows.MessageBox. Cuando se muestra inicialmente, se muestra en la parte superior de la ventana principal de la aplicación, como me gustaría. ¿Hay alguna forma en que pueda obligarlo a SIEMPRE permanecer en la parte superior de la ventana principal? El problema que tengo es que cuando se muestra MessageBox, los usuarios pueden hacer clic en la ventana principal de la aplicación y llevarla al frente, lo que significa que el MessageBox queda oculto a la vista. En este caso, el usuario puede no darse cuenta de que está allí, u olvidarse de ello, y para ellos, la aplicación principal parece haberse congelado.Forzar MessageBox para estar en la parte superior de la ventana de la aplicación en .net/WPF

He leído varios hilos sobre esto, pero ninguno ha resuelto el problema por mí.

Debo añadir que el hilo que pone el MessageBox podría no ser el hilo de UI. Gracias Tom

Respuesta

37

Utilice la versión de MessageBox.Show que toma el "propietario" de la ventana y pase su ventana.

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

Si su posiblemente no en el intento hilo de interfaz de usuario:

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

Puede:
1. Invoke para bloquear el hilo hasta MessageBox cierran o los
2. BeginInvoke en el que caso de que su el código del subproceso continuará ejecutándose, pero el subproceso de UI se bloqueará en MessageBox hasta que se desestime).

+0

¿Hay alguna otra forma de hacer esto si el hilo de la colocación de la de mensaje no es el hilo de interfaz de usuario (es decir, no el subproceso que posee el MainWindow)? –

+0

¡Ah, ahora que la información debería haber ido en la pregunta inicial, sugiero agregarla ahora! – Ricibob

+0

¿Ha intentado Despachar el código MessageBox en el subproceso UI? – Ricibob

0

Dentro de su "public partial class MainWindow : Window" coloque el siguiente código. Entonces Invoke ejecutará tu código dentro del hilo de UI.

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

Esta es una forma rápida de colocar el cuadro de mensaje en la parte superior de las ventanas de la aplicación.

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

Cuestiones relacionadas