¿Cómo salgo de una aplicación WPF mediante programación?

478

En los pocos años que he estado usando C # (Windows Forms), nunca he usado WPF. Pero ahora amo WPF, pero no sé cómo se supone que salga 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.

Peter Mortensen
fuente

Respuestas:

781

Para salir de su aplicación puede llamar

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

Como se describe en la documentación del Application.Shutdownmétodo, 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 se establece en OnLastWindowClose.
  • Cuando ShutdownMode se establece en OnMainWindowClose.
  • Cuando un usuario finaliza una sesión y el evento SessionEnding no se controla 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 Applicationobjeto, es decir, normalmente el hilo principal.

Dirk Vollmar
fuente
8
Como señalé, no es extraño. En WPF, la aplicación es una clase estática. Application.Current es una referencia a su aplicación actualmente en ejecución.
TimothyP
44
En mi opinión, es un poco extraño en el sentido de que esto no es obvio a primera vista, y se desvía lo suficiente de modelos anteriores como para desanimar a la gente. Tiene mucho sentido que funcione, por supuesto.
Brian MacKay
20
Si llama a Application.Current.Shutdown();su función no volverá inmediatamente. Necesitas llamar return;también para esto.
Erwin Mayer
2
He usado esto donde desde una ventana aparece otra ventana y, en el evento window_closed de esa ventana, agregué este código. todas las ventanas desaparecen, pero el programa aún se ejecuta más allá de donde se crea la ventana emergente.
diyoda_
77
@TimothyP No ApplicationNO es una clase estática. Tener un Application.Currentmiembro estático no significa que sea estático. En cambio, es una clase normal que se puede derivar.
Earth Engine el
156

Si realmente lo necesita para cerrar, también puede usar Environment.Exit () , pero no es nada gracioso (más bien como finalizar el proceso).

Úselo de la siguiente manera:

Environment.Exit(0)
Juan
fuente
44
Environment.Exit()necesita al menos un parámetro, un código de salida. Úselo Environment.Exit(0)si no le preocupa el código de salida.
gbmhunter
24
Este método realmente cerró todo. Mi aplicación estaba dejando algo ejecutándose (el formulario se estaba cerrando, pero todavía se estaba ejecutando un proceso) conApplication.Current.Shutdown();
gbmhunter
44
Environment.Exit es definitivamente la forma correcta de garantizar 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 vuelve a entrar en el despachador.
Marcus Andrén
Tan igual como Application.exit (0);
Sayka
Con Application.Current.Shutdown();mi Closingevento se llamó, cuando simplemente quería cerrar mi aplicación de inmediato. Entonces Environment.Exit(0);fue la mejor opción.
FredM
64

Como wuminqi dijo ,Application.Current.Shutdown(); es irreversible, y creo que generalmente se usa para forzar a una aplicación a cerrarse en momentos como cuando un usuario está cerrando sesión o cerrando Windows.

En su lugar, llame this.close()a su ventana principal. Esto es lo mismo que presionar Alt+ F4o el botón cerrar [x] en la ventana. Esto hará que se cierren todas las demás ventanas de propiedad y terminará llamando Application.Current.Shutdown();siempre que no se cancele la acción de cierre. Consulte la documentación de MSDN sobre Cómo cerrar una ventana .

Además, debido a que this.close()es cancelable, puede colocar un diálogo de confirmación de guardar cambios en el controlador de eventos de cierre. Simplemente haga un controlador de eventos para <Window Closing="...">y cambie en e.Cancelconsecuencia. (Consulte la documentación de MSDN para obtener más detalles sobre cómo hacer esto).

Allen Pestaluky
fuente
2
+1 Decidí seguir con este, especialmente porque necesito guardar los archivos abiertos 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 de propiedad se cerrarán. Debe asegurarse 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 pérdida potencial de memoria a menos que cierre esa ventana por otros medios (administrador de tareas, etc.). He probado esto.
BK
35

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

Sobre todo, los métodos llamarán closing eventa la Windowclase y la ejecución puede detenerse en algún momento (porque generalmente las aplicaciones colocan diálogos como '¿estás seguro?' O ' ¿Te gustaría guardar datos antes de cerrar? ', Antes de que una ventana se cierre por completo)

3. Pero si desea finalizar la aplicación sin previo aviso de inmediato. Use a continuación

   Environment.Exit(0);
Kylo Ren
fuente
18

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 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 xbotón superior derecho . Si alguno de los métodos requiere Window_Closing(...)cerrar la ventana, toma el evento para apagarlo si el usuario lo confirma.

La razón por la que lo 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 un padre de una de mis ventanas en una aplicación, si esa ventana se abre sin que se muestre previamente hasta el último cierre activo de la ventana, me quedo con una ventana oculta ejecutándose en segundo plano. La aplicación no se cerrará. La única forma de evitar una pérdida total de memoria es que vaya al Administrador de tareas para cerrar la aplicación. Application.Current.Shutdown()me protege de defectos de diseño no intencionados.

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

BK
fuente
16

No debe haber un Application.ShutDown();o .Exit()mensaje.

ApplicationEs una clase estática. No se refiere a la aplicación actual. Debe acceder a la aplicación actual y luego cerrarla de esta manera:

Application.Current.Shutdown();
TimothyP
fuente
8

Otra forma de hacer esto:

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

Esto forzará a matar su aplicación. Siempre funciona, incluso en una aplicación multiproceso.

Nota: Solo tenga cuidado de no perder datos no guardados en otro hilo.

Ali Yousefi
fuente
Esto parece incomprensible: "en proceso siempre funciona" . ¿Puedes arreglarlo? ¿O al menos explica aquí en comentarios lo que quieres decir?
Peter Mortensen
Esto también es en parte incomprensible: solo preocúpese por una aplicación que haya guardado datos en archivos de otro hilo. ¿Puedes arreglarlo? ¿O al menos explica aquí en comentarios lo que quieres decir?
Peter Mortensen
¿Estás usando el traductor de Google?
Peter Mortensen
no, no, lo que quiero decir es cuando la aplicación se está ejecutando como subprocesos múltiples y usted usa Process.Kill funcionará, pero de otra manera como esta. Cierre no funciona en aplicaciones multiproceso cuando se está ejecutando otro subproceso.
Ali Yousefi
6
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);
}
Ravi
fuente
esta no es la respuesta a la pregunta, solo quiere saber cómo salir de la aplicación wpf.
mehdi
6

Tratar

App.Current.Shutdown();

Para mi

Application.Current.Shutdown(); 

no funcionó

Iwona Kubowicz
fuente
6

Según tengo entendido, 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.

wuminqi
fuente
77
No entiendo esto Application.Current.Shutdown()Sin embargo, podemos obtener la confirmación del usuario antes de llamar .
Amsakanna
2
No veo por qué deberías confirmar. Demasiadas confirmaciones es algo muy malo. El hecho de que alguien se haya esforzado por hacer clic para abrir el menú Archivo, desplazarse hasta la parte inferior del menú Archivo y luego hacer clic en Salir, confirma que ya no desea utilizar la aplicación.
Veer: en mi caso, aparece la ventana de confirmación, pero incluso cuando elige "cancelar" en la confirmación, la aplicación principal se cierra.
wuminqi
77
JTS: Es mejor diseñarlo caso por caso. Nuestra aplicación, si hay trabajos en ejecución, la salida
forzada
3

Resumiendo, hay algunas maneras de hacerlo.

1) Eliminar el proceso, que omite la finalización, el manejo de errores, etc.

Process.GetCurrentProcess().Kill();

2) Cerrar la aplicación actual, que probablemente sea la forma correcta porque llama a los eventos de salida:

Application.Current.Shutdown();

o

this.Shutdown();

(cuando se incluye en una instancia de App-class)

3) Cierre de la aplicación actual (todos los formularios deben cerrarse / terminarse antes):

this.Close(); 

(cuando se incluye en una instancia de App-class)

4) Salir del entorno, que finaliza la aplicación:

Environment.Exit(0);

Además, es posible que desee leer sobre estadísticas de salida aquí

borgoña
fuente
2

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 });
    }
}
Anders
fuente
¿Qué significa "Caliburn micro sabor" ?
Peter Mortensen
Cómo lo lograrías usando Caliburn Micro
Anders
0

Si desea salir de otro hilo que no creó el objeto de la aplicación, use:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();
SoumyaMahunt
fuente
-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

Alfa-LIon
fuente
2
¡Bienvenido a SO, Alpha-LIon! Aquí se desaconsejan las respuestas de solo código, ya que no proporcionan información sobre cómo se resolvió el problema. Actualice su solución con una explicación de cómo su código resuelve el problema del OP :)
Joel
-3

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

Command="SystemCommands.MinimizeWindowCommand"

Creo que esta debería ser la forma preferida ...

Markus Sommerschnee
fuente
Minimize! = Salir de la aplicación. No veo una opción de aplicación de salida en esa lista. Parece más administración de ventanas y cerrar ventana no necesariamente significa cerrar la aplicación. msdn.microsoft.com/en-us/library/…
kenny