2011-04-26 17 views
5

Tal vez una pregunta estúpida para C#, WPF, .NET 4.0:programa no se detiene después nueva ventana

Si hago una nueva ventana en una clase derivada y no llamo ShowDialog en esta ventana, mi programa no se cierra más de cerca.

Ejemplo:

 Window d = new Window(); 
     //d.ShowDialog(); 

¿Por qué es esto así?

No quiero mostrar la ventana, solo quiero usar este objeto para algún propósito. Entonces, ¿qué tengo que hacer para permitir que mi programa se cierre después?

Respuesta

7

Es muy probable que haya configurado la aplicación para cerrar única cuando todos sus ventanas se han cerrado, y mediante la creación de una nueva ventana eso nunca se cierra, tu aplicación nunca se cierra.

Esta configuración se rige por Application.ShutdownMode property, que especifica la condición que ocasiona que se llame al Shutdown method. Esencialmente, tienes tres opciones.

  1. El primero, como le ha surgido, no cerrará su solicitud a menos que y hasta que todas las ventanas que se ha creado se han cerrado. No importa si han sido cerrados por el usuario o mediante programación al llamar al método Close.

    Esta opción se especifica configurando la propiedad Application.ShutdownMode en OnLastWindowClose.

  2. El segundo método se aprovecha del hecho de que casi todas las aplicaciones tienen una ventana "principal" (que es el primero que se visualiza cuando se inicia su aplicación), y tiene el tiempo de ejecución cerrará automáticamente toda la aplicación (y todos ventanas hijas) cuando esta ventana principal está cerrada. Nuevamente, es irrelevante si el usuario cierra la ventana o la cierra a través del código.

    Esta opción se especifica configurando la propiedad Application.ShutdownMode en OnMainWindowClose.

  3. La tercera opción básicamente indica que va a administrar cosas manualmente. No cerrará la aplicación hasta que no llame al Shutdown method usted mismo a través del código.

    Esta opción se especifica configurando la propiedad Application.ShutdownMode en OnExplicitShutdown.

Mi recomendación, en este caso, es que se establezca la opción segundo, y que su aplicación se cierran automáticamente cuando el usuario cierra la ventana principal. Esto evitará que cualquier ventana secundaria perdida que aún se muestre impida que se cierre tu aplicación. Esto elimina la necesidad de escribir el código que se muestra en Stecya's answer, y permite que el tiempo de ejecución maneje todo esto automáticamente.

3

puede utilizar este código para cerrar todas las ventanas

private void CloseAllWindows() 
    { 
    foreach(var window in Application.Current.Windows) 
     window.Close(); 
    } 
+1

+1, Bonita. // no es necesario 'ToList()'. – Homam

Cuestiones relacionadas