¿Cómo salgo de una aplicación WPF programáticamente?

En los pocos años que he estado usando C # (Windows Forms), 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.

Yo he tratado:

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

Entre muchos otros. Nada funciona.

Para salir de su aplicación puede llamar

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

Tal como se describe en la documentación del método Application.Shutdown , también puede modificar el comportamiento de apagado de su aplicación especificando un ShutdownMode :

Windows Presentation Foundation (WPF) invoca implícitamente el apagado en las siguientes situaciones:

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

Tenga en cuenta también que Application.Current.Shutdown(); solo se puede invocar desde el hilo que creó el objeto Application , es decir, normalmente el hilo principal.

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

Úselo de la siguiente manera:

 Environment.Exit(0) 

Como dijo wuminqi , Application.Current.Shutdown(); es irreversible, y creo que normalmente se usa para forzar el cierre de una aplicación a veces, como cuando un usuario cierra la sesión o cierra Windows.

En su lugar, llame this.close() en su 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 a Application.Current.Shutdown(); siempre y cuando la acción de cierre no haya sido cancelada. Consulte la documentación de MSDN en Cerrar una ventana .

Además, como this.close() es this.close() , puede colocar un cuadro de diálogo de confirmación de cambios guardados en el controlador de eventos de cierre. Simplemente e.Cancel un controlador de eventos para y cambie e.Cancel consecuencia. (Consulte la documentación de MSDN para obtener más detalles sobre cómo hacer esto).

Use 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, se llama closing event de closing event de la clase Window y la ejecución puede detenerse en algún momento (por lo general, las aplicaciones colocan diálogos como ‘¿está seguro?’ O ‘ ¿Desea guardar datos antes de cerrar? ‘, Antes de que se cierre por completo)

3. Pero si desea terminar la aplicación sin ninguna advertencia de inmediato. Use debajo

  Environment.Exit(0); 

Esto debería funcionar:

 Application.Current.Shutdown(); 

Si está interesado, aquí hay material adicional que encontré útil:

Detalles sobre la aplicación. Actual

Aplicación WPF LifeCycle

Así es como hago el 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(); } } 

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

La razón por la que sí uso Application.Current.Shutdown() en mi ventana principal es que me he dado cuenta de que si se cometió un error de diseño y no he declarado uno de mis padres en una aplicación, si la ventana se abre sin mostrarse 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.

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

Application es una clase estática. No se refiere a la aplicación actual. Necesitas llegar a la aplicación actual y luego cerrarla de esta manera:

 Application.Current.Shutdown(); 

Tratar

 App.Current.Shutdown(); 

Para mi

 Application.Current.Shutdown(); 

no funcionó

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

Según lo que entiendo, Application.Current.Shutdown() también tiene su inconveniente.

Si desea mostrar una ventana de confirmación para permitir que los usuarios confirmen al salir o no, Application.Current.Shutdown() es irreversible.

Otra forma en que puedes hacer esto:

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

Esto obligará a matar a su aplicación en proceso siempre funciona en una aplicación de subprocesos múltiples.

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

Caliburn micro saborizado

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

Desde el código xaml puede llamar a un SystemCommand predefinido:

 Command="SystemCommands.MinimizeWindowCommand" 

Creo que esta debería ser la forma preferida …

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

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

Muy simple. Use el siguiente código:

 Application.Current.Shutdown();