cómo establecer MessageBox.Owner WPF a la ventana del escritorio porque SplashScreen cierra MessageBox

StackOverflow https://stackoverflow.com/questions/576503

  •  05-09-2019
  •  | 
  •  

Pregunta

Estoy utilizando el función SplashScreen en WPF mediante el establecimiento de un mapa de bits Acción de generación para Splashscreen. Detrás de la pantalla de bienvenida, información sobre licencias está siendo cheque, y si no me muestran un de mensaje .

De acuerdo con esta Comentarios , se es porque el MessageBox.Owner es la pantalla de bienvenida y tan pronto como otra ventana está abierta, incluso si se trata de un cuadro de mensaje se cierra la ventana de la pantalla de bienvenida que luego a su vez cierra el cuadro de mensaje, por lo que el usuario nunca ve el cuadro de mensaje.

Así que la solución sería establecer el MessageBox.Owner a otra ventana, pero eso significaría que tengo que crear una instancia de otra ventana que no podría incluso ser necesario.

¿Sería posible establecer el MessageBox.Owner a la ventana del escritorio? Y cómo, debido a que la única otra función que viene a la mente es la GetDesktopWindow () función de la API, pero que devuelve un identificador de ventana y MessageBox.Owner es una ventana de WPF.

¿Fue útil?

Solución 3

He encontrado el problema. También estoy usando la pantalla de acumulación en la que hace esto: WPF SplashScreen cierra de mensaje

Otros consejos

Dado que el uso de la ventana de escritorio como el padre para sus cuadros de diálogo modales no es una buena idea, ya que @Nir señaló en su respuesta, aquí hay otras tres soluciones:

1) Utilizar una ventana oculta. Crear una pequeña ventana, no modal para actuar como el padre de su cuadro de mensaje o de otro tipo de diálogo modal. Este enfoque se describe aquí:

http: //social.msdn.microsoft.com/Forums/en-US/wpf/thread/116bcd83-93bf-42f3-9bfe-da9e7de37546/

2) Crear ventanas de mensajes no modales. Cambiar su modo de inicio para apagar explícita y utilizar una ventana no modal para mostrar su mensaje. Este enfoque se describe en la respuesta a esta pregunta StackOverflow:

de mensaje con detalles de la excepción desaparece inmediatamente si utilizar la pantalla de bienvenida en WPF 4.0

3) Llamada de mensaje dos veces. Al parecer, el problema sólo afecta a la primera muestra de diálogo modal. Por lo que podría llamar simplemente su diálogo modal dos veces, si no le importa el flash de la primera apertura y cierre.

https: // conectarse .microsoft.com / VisualStudio / feedback / detalles / 600197 / WPF-splash-screen-despide-de cuadro de diálogo

En lo personal, no me gusta ninguna de estas soluciones. La única otra opción es evitar la funcionalidad SplashScreen incorporado y rodar su propia desde cero. Aquí hay un enlace si desea investigar esa ruta aún más:

http: //social.msdn.microsoft.com/Forums/en-US/wpf/thread/8dd49fd0-9cc9-43c6-b285-6f119ab8a32e/

Por último, si eres tan molesto por este problema como yo, puede votar por Microsoft para corregir este error aquí:

http: // conectarse .microsoft.com / VisualStudio / feedback / detalles / 600197 / WPF-splash-screen-despide-de cuadro de diálogo

Se me ocurrió con esta solución a mí mismo, así que tal vez hay algo malo en ello, pero parece que funciona perfectamente:

Window temp = new Window() { Visibility=Visibility.Hidden };
temp.Show();
MessageBox.Show(temp, "An error occurred before the application could start.\n\nTechnical Details: " + ex.Message, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Stop);
App.Current.Shutdown(1);

Se puede publicar algo de código? Acabo de intentar añadir esta en el fichero de App.xaml.cs en una nueva aplicación de WPF:

protected override void OnStartup(StartupEventArgs e)
{
    if (MessageBox.Show("Start app?", "Confirm Start", 
        MessageBoxButton.YesNo) == MessageBoxResult.No)
    {
        this.Shutdown();
        return;
    }

    this.StartupUri = new Uri("Window1.xaml", UriKind.Relative);
    base.OnStartup(e);
}

... y funciona como se espera (el indicador "Confirmar Inicio" permanece abierto hasta que me he respondido, y si hago clic en "No" la aplicación se cierra).

La ventana de escritorio nunca es la matriz correcta, lea esto para saber por qué:

http://blogs.msdn.com/oldnewthing /archive/2004/02/24/79212.aspx

Ahora el problema descrito en este artículo no se produce tanto porque MS trabajó alrededor de ella, en este post se puede ver cómo:

http://blogs.msdn.com/oldnewthing /archive/2006/11/02/931674.aspx

Esto me ha ayudado mucho ..... Dada mi nueva idea pero el código de ejemplo que he visto aquí tiene alguna modificación requerida

A continuación se muestra un ejemplo simple en WPF con modificación Ahora se está trabajando

en el botón de clic

pega este código

Si (System.Windows.Forms.MessageBox.Show ( "Are u seguro", "Borrar", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows .Forms.DialogResult.Yes)             {                 this.Close ();             }             más             {                 MessageBox.Show ( "¿por qué no eliminar");             }

Esto no está directamente relacionada con la situación de la OP, pero podría ser útil para otras personas que tienen problemas con cuadro de mensaje que se ocultan detrás de otras ventanas en ciertas situaciones especiales.

Como @dthrasher menciones, una solución es utilizar una ventana oculta ficticia. Pero a veces ni siquiera eso es suficiente. Yo tenía una situación en la que la solución era no sólo utilizar una ventana oculta ficticia, pero a su vez en su propiedad TopMost cada vez que lo usé con cuadro de mensaje.

     _formKludge.TopMost = true;

     MessageBox.Show(_formKludge, "Nice informative message.", "Super-duper Program",
                     MessageBoxButtons.OK, MessageBoxIcon.Error);

     _formKludge.TopMost = false;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top