En su MainWindow.xaml.cs
, intente hacer esto:
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Application.Current.Shutdown();
}
Según este enlace, también puede configurar ShutdownMode
en XAML:
http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnExplicitShutdown"
>
</Application>
Las aplicaciones dejan de ejecutarse solo cuando se llama al Shutdown
método de Application
. El cierre puede ocurrir implícita o explícitamente, según lo especificado por el valor de la ShutdownMode
propiedad.
Si lo establece ShutdownMode
en OnLastWindowClose
, Windows Presentation Foundation (WPF) llama implícitamente a Shutdown cuando se cierra la última ventana de una aplicación, incluso si alguna de las ventanas instanciadas actualmente está configurada como la ventana principal (consulte MainWindow).
Una ShutdownMode
de OnMainWindowClose
hace que WPF llame implícitamente a Shutdown cuando se cierra MainWindow, incluso si hay otras ventanas abiertas.
La vida útil de algunas aplicaciones puede no depender de cuándo se cierra la ventana principal o la última ventana, o puede que no dependa en absoluto de las ventanas. Para estos escenarios, debe establecer la ShutdownMode
propiedad en OnExplicitShutdown
, que requiere una Shutdown
llamada de método explícita para detener la aplicación. De lo contrario, la aplicación continúa ejecutándose en segundo plano.
ShutdownMode
se puede configurar de forma declarativa desde XAML o mediante programación desde el código.
Esta propiedad solo está disponible en el hilo que creó el Application
objeto.
En su caso, la aplicación no se cierra porque probablemente esté usando el valor predeterminado OnLastWindowClose
:
Si lo establece ShutdownMode
en OnLastWindowClose
, WPF llama implícitamente a Shutdown cuando se cierra la última ventana de una aplicación, incluso si alguna de las ventanas instanciadas actualmente está configurada como la ventana principal (consulte MainWindow
).
Dado que abre una nueva ventana y no la cierra, no se llama al cierre.
Application.Current.Shutdown()
cerrará la aplicación inmediatamente como si finalizara el proceso en la barra de tareas. Esto es como dispararle a alguien, antes de que diga su última palabra :) .. No lo recomendaría.Me alegro de que haya recibido su respuesta, pero por el bien de los demás, también responderé su pregunta para agregar algo de información.
Paso 1
Primero, si desea que su programa se cierre cuando se cierre la ventana principal, debe especificarlo, ya que no es WinForms donde este comportamiento es predeterminado.
(El valor predeterminado en WPF es cuando se cierra la última ventana)
En codigo
Ir a la instancia de la aplicación en su punto de entrada (programa de WPF En VS 2012, el valor por defecto es el interior anidada
App.xaml
, así que vaya dentro de él y vaya aApp.xaml.cs
Utilizar y crear un constructor).En el constructor de especificar que el
Application
'sShutdownMode
deben serShutdownMode
.OnLastWindowClose
.public App() { ShutdownMode = ShutdownMode.OnLastWindowClose; }
En XAML
Vaya a su
App.xaml
archivo que VS 2012 crea de forma predeterminada (o crear usted mismo) La raíz es unaApplication
, especifique el interior que susApplication
'sShutdownMode
deben serShutdownMode
.OnLastWindowClose
.<Application x:Class="WpfApplication27.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose">
Si funciona, ya está; puedes dejar de leer.
Paso 2
Si lo anterior no funcionó (supongo que escribió la aplicación WPF desde cero), la ventana principal probablemente no sea conocida por la aplicación como la ventana principal. Así que especifica eso también.
En codigo
Vaya al constructor de la aplicación como lo hizo en el Paso 1 y especifíquelo
Application
.MainWindow
El valor es tuWindow
:En XAML
Vaya al
Application
XAML como lo hizo en el Paso 1 y especifíqueloApplication
.MainWindow
El valor es tuWindow
:MainWindow = "mainWindow";
Alternativa
No creo que este es el mejor enfoque, sólo porque WPF no quiere que haga esto (por lo que tiene
Application
'sShutdownMode
), pero sólo se puede utilizar un evento / sustituir un método evento (OnEventHappened).Vaya al archivo de código subyacente de MainWindow y agregue:
protected override void OnClosed(EventArgs e) { base.OnClosed(e); App.Current.Shutdown(); }
fuente
MainWindow
en la instancia de la ventana principal, establecerShutdownMode
enShutdownMode.OnMainWindowClose
, llamarMainWindow.Show()
a la devolución de llamada alStartup
evento deApp
. Esta es la solución más mínima que se me ocurrió y que funciona como se esperaba al menos en .NET Core 3 con WPF.Porque el modo de apagado predeterminado en una aplicación WPF es OnLastWindowClose, lo que significa que la aplicación se detiene cuando se cierra la última ventana.
Cuando crea una instancia de un nuevo objeto Window, se agrega automáticamente a la lista de ventanas en la aplicación. Entonces, el problema era que su aplicación estaba creando dos ventanas cuando se inició - MainWindow y Window01 aún no mostrada - y si solo cerraba MainWindow, Window01 mantendría su aplicación en ejecución.
Normalmente, creará un objeto de ventana en el mismo método que llamará a su ShowDialog, y creará un nuevo objeto de ventana cada vez que se muestre el diálogo.
fuente
Me encontré con esta Pregunta cuando buscaba otra cosa y me sorprendió no poder ver ninguna de las respuestas propuestas que se mencionan
Window.Owner
.{ var newWindow = new AdditionalWindow(); newWindow.Owner = Window.GetWindow(this); // then later on show the window with Show() or ShowDialog() }
Una llamada a
Window.GetWindow(this)
es bastante útil en vista de una aplicación MVVM cuando se está lejos en el árbol visual sin saber dónde ha creado una instancia, se le puede llamar mediante el suministro de cualquierFrameWork
elemento (por ejemploUserContol
,Button
,Page
). Obviamente, si tiene una referencia directa a la ventana, use esa o inclusoApplication.Current.MainWindow
.Esta es una relación bastante poderosa que tiene una serie de beneficios útiles de los que es posible que no se dé cuenta al principio (suponiendo que no haya codificado específicamente ventanas separadas para evitar estas relaciones).
Si llamamos a su ventana principal
MainWindow
y la segunda ventana comoAdditionalWindow
entonces ...MainWindow
también minimizaráAdditionalWindow
MainWindow
también restauraráAdditionalWindow
MainWindow
se cerraráAdditionalWindow
, pero el cierreAdditionalWindow
no se cerraráMainWindow
AdditioanlWindow
nunca se "perderá" debajoMainWindow
, es decir,AddditionalWindow
siempre se muestra arribaMainWindow
en el orden z si solíaShow()
mostrarlo (¡bastante útil!)Sin embargo, una cosa a tener en cuenta, si tiene esta relación, entonces no se llama al
Closing
evento en elAdditionalWindow
, por lo que tendría que iterar manualmente sobre laOwnedWindows
colección. Por ejemplo, cree una forma de llamar a cada ventana a través de una nueva interfaz o método de clase base.private void MainWindow_OnClosing(object sender, CancelEventArgs e) { foreach (var window in OwnedWindows) { var win = window as ICanCancelClosing; // a new interface you have to create e.Cancel |= win.DoYouWantToCancelClosing(); } }
fuente
Nada de lo anterior funcionó para mí, tal vez porque nuestro proyecto usa Prism. Así que terminé usando esto en App.XAML.cs
protected override void OnExit(ExitEventArgs e) { base.OnExit(e); Process.GetCurrentProcess().Kill(); }
fuente
Parece algo con lo que me encontré cuando creé una segunda ventana para actuar como un cuadro de diálogo. Cuando se abrió la segunda ventana y luego se cerró y luego se cerró la ventana principal, la aplicación siguió ejecutándose (en segundo plano). Agregué (o confirmé) lo siguiente en mi App.xaml:
<Application x:Class="XXXXXXX.App" ... StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose"> <Application.MainWindow > <NavigationWindow Source="MainWindow.xaml" Visibility="Visible" /> </Application.MainWindow>
Sin alegría.
Entonces, finalmente entré en mi "MainWindow.xaml" y agregué una propiedad "Cerrada" a la ventana que fue a un método "MainWind_Closed" que se parece a lo siguiente:
private void MainWind_Closed(object sender, EventArgs e) { foreach ( Window w in App.Current.Windows ) { if (w.DataContext != this) w.Close(); } }
Al ejecutar el depurador, parece que la única ventana que aparece es la ventana que creé como diálogo; en otras palabras, el bucle foreach solo encuentra una ventana: el diálogo, no la principal.
Tenía "this.Close ()" ejecutándose en el método que cerraba el diálogo, y tenía un "dlgwin.Close ()" que venía después de "dlgwin.ShowDialog ()", y eso no funcionó. Ni siquiera un "dlgwin = null".
Entonces, ¿por qué no se cerraría ese diálogo sin estas cosas adicionales? Oh bien. Esto funciona.
fuente