c# - usar - ¿Cómo salgo programáticamente de una aplicación WPF?
programar wpf c# (16)
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 que se cierre la ventana, Window_Closing(...)
agarra el evento para apagarlo si el usuario lo confirma.
La razón por la que de hecho uso Application.Current.Shutdown()
en mi ventana principal es que he notado que si se cometió un error de diseño y no he declarado a un padre de una de mis ventanas en una aplicación, si eso La ventana se abre sin mostrarse antes del último cierre de la ventana activa; me queda una ventana oculta que se ejecuta en segundo plano. La aplicación no se cerrará. La única forma de evitar la pérdida de memoria completa es que ingrese al Administrador de tareas para cerrar la aplicación. Application.Current.Shutdown()
me protege de fallas de diseño involuntarias.
Eso es de mi experiencia personal. Al final, usa lo que sea mejor para tu escenario. Esto es solo otra pieza de información.
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 debo salir de mi aplicación cuando el usuario hace clic en el elemento del menú Salir del menú Archivo.
Yo he tratado:
this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();
Entre muchos otros. Nada funciona.
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 });
}
}
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 apaga Windows.
En su lugar, llame a this.close()
en su ventana principal. Esto es lo mismo que presionar Alt + F4 o el botón 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 fue cancelada. Por favor, consulte la documentación de MSDN en Cerrar una ventana .
Además, debido a que this.close()
es this.close()
, puede colocar un diálogo de confirmación para guardar los cambios en el controlador de eventos de cierre. Simplemente haga un controlador de eventos para <Window Closing="...">
y cambie e.Cancel
consecuencia. (Consulte la documentación de MSDN para obtener más detalles sobre cómo hacer esto).
Desde el código xaml puede llamar a un SystemCommand predefinido:
Command="SystemCommands.MinimizeWindowCommand"
Creo que esta debería ser la forma preferida ...
Esto debería funcionar:
Application.Current.Shutdown();
Si estás interesado, aquí hay material adicional que me pareció útil:
Muy simple. Usa el siguiente código:
Application.Current.Shutdown();
No debería haber un Application.ShutDown();
o 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 apagarla así:
Application.Current.Shutdown();
Otra forma en que puedes hacer esto:
System.Diagnostics.Process.GetCurrentProcess().Kill();
Esto forzará el cierre de su aplicación en proceso, siempre funciona en una aplicación de subprocesos múltiples.
Nota: Solo importa una aplicación que tenga datos guardados en archivos de otro hilo.
Para salir de tu aplicación puedes llamar
System.Windows.Application.Current.Shutdown();
Como se describe en la documentación del método Application.Shutdown
, también puede modificar el comportamiento de cierre de su aplicación especificando un ShutdownMode :
Windows Presentation Foundation (WPF) llama implícitamente a Shutdown 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 maneja o se maneja sin cancelación.
Tenga en cuenta también que Application.Current.Shutdown();
solo se puede llamar desde el hilo que creó el objeto Application
, es decir, normalmente el hilo principal.
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.
Según mi entendimiento, Application.Current.Shutdown()
también tiene su inconveniente.
Si desea mostrar una ventana de confirmación para permitir que los usuarios confirmen si salen o no, Application.Current.Shutdown()
es irreversible.
Si realmente lo necesita para cerrar, también puede usar Environment.Exit() , pero no es elegante en absoluto (más como terminar el proceso).
Úsalo de la siguiente manera:
Environment.Exit(0)
Tratar
App.Current.Shutdown();
Para mi
Application.Current.Shutdown();
no funcionó
Utilice 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();
Sobre todo, los métodos llamarán al closing event
de closing event
de la clase de la Window
y la ejecución puede detenerse en algún momento (ya que las aplicaciones suelen incluir diálogos como ''¿está seguro?'' O '' ¿Desea guardar los datos antes de cerrar? '', Antes de que la ventana se cierre completamente)
3. Pero si desea terminar la aplicación sin ningún aviso de inmediato. Usar abajo
Environment.Exit(0);
Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
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);
}