2010-05-12 33 views
351

En los pocos años que he estado usando C# (WinForms), nunca he usado WPF. Pero, ahora me encanta WPF, pero no sé cómo se supone que debo salir de mi aplicación cuando el usuario hace clic en el elemento de menú Salir del menú Archivo.¿Cómo salir de una aplicación WPF programáticamente?

que he intentado:

this.Dispose(); 
this.Exit(); 
Application.ShutDown(); 
Application.Exit(); 
Application.Dispose(); 

Entre muchos otros. Nada funciona.

Respuesta

588

Para salir de su aplicación puede llamar al

System.Windows.Application.Current.Shutdown(); 

Como se describe en la documentación para el método Application.Shutdown también se puede modificar el comportamiento de apagado de su aplicación especificando un ShutdownMode: Apagado

se llama implícitamente por Windows Presentation Foundation (WPF) en las siguientes situaciones:

  • Cuando ShutdownMode se establece en OnLastWindowClose.
  • Cuando ShutdownMode se establece en OnMainWindowClose.
  • Cuando un usuario finaliza una sesión y el evento SessionEnding no se gestiona o se gestiona sin cancelación.

Tenga en cuenta también que Application.Current.Shutdown(); solamente pueden ser llamados desde el subproceso que creó el objeto Application, es decir, normalmente el hilo principal.

+6

Como señalé, no es raro. En WPF Application es una clase estática. Application.Current es una referencia a su aplicación actualmente en ejecución. – TimothyP

+4

En mi opinión, es un poco raro en el sentido de que esto no es obvio a primera vista, y se aparta lo suficiente de los modelos anteriores para echar a la gente. Tiene perfecto sentido que funcione, por supuesto. –

+0

Ponlo simple: porque si tu última ventana está cerrada con ... this.Close() ... La aplicación se cerrará, siempre que no hayas cambiado el Modo de apagado. – HelloSam

14

No debería haber una Application.ShutDown(); o el mensaje .Exit().

La aplicación es una clase estática. No se refiere a la aplicación actual Usted tiene que estar a la aplicación actual y luego apagarlo así:

Application.Current.Shutdown(); 
4

Según mi entendimiento, Application.Current.Shutdown() también tiene su inconveniente,

si quieres para mostrar una ventana de confirmación que permita a los usuarios confirmar al salir o no, Application.Current.Shutdown() es irreversible.

+6

No entiendo esto. Sin embargo, podemos obtener la confirmación del usuario antes de llamar a 'Application.Current.Shutdown()'. – Amsakanna

+1

No veo por qué debería confirmarlo. Demasiadas confirmaciones es algo muy malo. El hecho de que alguien haya hecho el esfuerzo de hacer clic para abrir el menú Archivo, bajar hasta el final del menú Archivo y luego hacer clic en Salir, se confirma que ya no desean usar la aplicación. –

+0

Veer: En mi caso, la ventana de confirmación aparece, pero incluso cuando eliges "cancelar" en la confirmación, la aplicación principal sale. – wuminqi

48

Como dijo wuminqi, Application.Current.Shutdown(); es irreversible y creo que normalmente se usa para forzar el cierre de una aplicación en momentos como cuando un usuario cierra la sesión o cierra Windows. En su lugar, llame al this.close() en la ventana principal. Esto es lo mismo que presionar "ALT-F4" o el botón de cerrar [x] en la ventana. Esto hará que todas las demás ventanas de propiedad se cierren y terminará llamando al Application.Current.Shutdown();, siempre que no se haya cancelado la acción de cierre. Consulte la documentación de MSDN en Closing a Window.

Además, como this.close() es cancelable, puede colocar un cuadro de diálogo de confirmación de cambios guardados en el controlador de eventos de cierre. Simplemente haga un controlador de eventos para <Window Closing="..."> y cambie e.Cancel en consecuencia. (Consulte MSDN doc para obtener más detalles sobre cómo hacerlo)

+1

+1 Decidí ir con este, especialmente porque tengo que guardar abierto archivos antes de salir de la aplicación. – AgentKnopf

+2

Una cosa importante a tener en cuenta aquí es el hecho de que Allen señaló un hecho muy importante: todas las demás ventanas serán cerradas. Debes asegurarte de declarar la propiedad.Si tiene una ventana que se está ejecutando y luego abre otra ventana pero aún no la muestra, después de cerrar la ventana activa, la ventana oculta obligará a la aplicación a seguir ejecutándose. Tendrá una potencial pérdida de memoria a menos que cierre esa ventana por otros medios (administrador de tareas, etc.). He probado esto –

114

Si REALMENTE necesita que se cierre, también puede usar Environment.Exit() pero no es elegante en absoluto (más como finalizar el proceso).

uso de la siguiente manera:

Environment.Exit(0) 
+3

'Environment.Exit()' necesita al menos un parámetro, un código de salida. Use 'Environment.Exit (0)' si no está preocupado por el código de salida. – gbmhunter

+19

Este método realmente cerró todo. Mi aplicación dejaba algo en ejecución (el formulario se estaba cerrando, pero todavía se estaba ejecutando un proceso) con 'Application.Current.Shutdown();' – gbmhunter

+1

Environment.Exit es definitivamente la forma correcta de asegurar el cierre de una aplicación. Con Application.Current.Shutdown puede terminar fácilmente con la aplicación ejecutándose indefinidamente si tiene un código que se devuelve al despachador. –

13

Así es como lo hago mío:

// Any control that causes the Window.Closing even to trigger. 
private void MenuItemExit_Click(object sender, RoutedEventArgs e) 
{ 
    this.Close(); 
} 

// Method to handle the Window.Closing event. 
private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...", 
            MessageBoxButton.YesNo, MessageBoxImage.Exclamation); 
    if (response == MessageBoxResult.No) 
    { 
     e.Cancel = true; 
    } 
    else 
    { 
     Application.Current.Shutdown(); 
    } 
} 

Sólo pido Application.Current.ShutDown() desde la ventana principal de la aplicación, todas las demás ventanas utilizan this.Close(). En mi ventana principal, Window_Closing(...) maneja el botón superior derecho x. Si alguno de los métodos requiere cerrar la ventana, Window_Closing(...) toma el evento para cerrar si el usuario lo confirma.

La razón por la que uso de hecho Application.Current.Shutdown() en mi ventana principal es que he notado que si se cometió un error de diseño y no he declarado uno de mis ventanas en una aplicación, si esa ventana está abierto sin mostrar antes del último cierre de la ventana activa, me queda una ventana oculta ejecutándose en segundo plano. La aplicación no se apagará. La única forma de evitar la pérdida completa de memoria es que vaya al administrador de tareas para cerrar la aplicación. Application.Current.Shutdown() me protege de defectos de diseño involuntarios.

Eso es de mi experiencia personal. Al final, use lo mejor para su escenario. Esta es solo otra información.

5
private void _MenuExit_Click(object sender, RoutedEventArgs e) 
{ 
    System.Windows.Application.Current.MainWindow.Close(); 
} 

//Override the onClose method in the Application Main window 

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    MessageBoxResult result = MessageBox.Show("Do you really want to close", "", 
              MessageBoxButton.OKCancel); 
    if (result == MessageBoxResult.Cancel) 
    { 
     e.Cancel = true; 
    } 
    base.OnClosing(e); 
} 
-2

Muy simple, utilice el código de abajo

Application.Current.Shutdown(); 
+14

Acabas de copiar el código de arriba, ¿por qué te molestaría? – Celt

5

Trate

App.Current.Shutdown(); 

Para mí

Application.Current.Shutdown(); 

no funcionó.

0

Caliburn micro sabor

public class CloseAppResult : CancelResult 
{ 
    public override void Execute(CoroutineExecutionContext context) 
    { 
     Application.Current.Shutdown(); 
     base.Execute(context); 
    } 
} 

public class CancelResult : Result 
{ 
    public override void Execute(CoroutineExecutionContext context) 
    { 
     OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true }); 
    } 
} 
21

utilizar cualquiera de los siguientes, según sea necesario:

1.

App.Current.Shutdown(); 
OR 
Application.Current.Shutdown(); 

2.

App.Current.MainWindow.Close(); 
OR 
Application.Current.MainWindow.Close(); 

Por encima de todos los métodos llamará closing event de Window clase y la ejecución puede parar en algún momento (por lo general causan aplicaciones ponen diálogos como '¿Estás seguro?' o' ¿Desea guardar los datos antes de cerrar?', antes de que una ventana se cierra por completo)

3. Pero si quieres terminar la aplicación sin ninguna advertencia inmediatamente. Utilice a continuación

Environment.Exit(0); 
0

Podemos utilizar el método this.Close() en el archivo MainWindow.xaml.cs para cerrar la ventana.

O utilice el método App.Current.Shutdown() en el archivo MainWindow.xaml.cs para cerrar la ventana.

2

Otra manera de hacer esto:

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

Esto obligará a matar a su aplicación en el proceso siempre trabaja en aplicaciones multi hilo.

Nota: simplemente se preocupa por una aplicación que tiene guardar datos en archivos de otro hilo.

Cuestiones relacionadas