In Ihrem MainWindow.xaml.cs
versuchen dies zu tun:
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Application.Current.Shutdown();
}
Über diesen Link können Sie auch die ShutdownMode
in XAML festlegen :
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>
Anwendungen werden erst beendet, wenn die Shutdown
Methode von Application
aufgerufen wird. Das Herunterfahren kann implizit oder explizit erfolgen, wie durch den Wert der ShutdownMode
Eigenschaft angegeben.
Wenn Sie setzen ShutdownMode
auf OnLastWindowClose
, Windows Presentation Foundation (WPF) implizit ruft Shutdown , wenn das letzte Fenster in einer Anwendung schließt, auch wenn alle derzeit instanziiert Fenster als Hauptfenster gesetzt werden (siehe Hauptfenster).
A ShutdownMode
von OnMainWindowClose
bewirkt, dass WPF beim Schließen des MainWindow implizit Shutdown aufruft, selbst wenn derzeit andere Fenster geöffnet sind.
Die Lebensdauer einiger Anwendungen hängt möglicherweise nicht davon ab, wann das Hauptfenster oder das letzte Fenster geschlossen wird, oder hängt überhaupt nicht von Fenstern ab. Für diese Szenarien müssen Sie die ShutdownMode
Eigenschaft auf festlegen OnExplicitShutdown
, was einen expliziten Shutdown
Methodenaufruf erfordert , um die Anwendung zu stoppen. Andernfalls wird die Anwendung im Hintergrund weiter ausgeführt.
ShutdownMode
kann deklarativ aus XAML oder programmgesteuert aus Code konfiguriert werden.
Diese Eigenschaft ist nur in dem Thread verfügbar, der das Application
Objekt erstellt hat.
In Ihrem Fall wird die App nicht geschlossen, da Sie wahrscheinlich die Standardeinstellung verwenden OnLastWindowClose
:
Wenn Sie ShutdownMode
diese OnLastWindowClose
Option festlegen , ruft WPF implizit Shutdown auf, wenn das letzte Fenster in einer Anwendung geschlossen wird, auch wenn derzeit instanziierte Fenster als Hauptfenster festgelegt sind (siehe MainWindow
).
Da Sie ein neues Fenster öffnen und nicht schließen, wird das Herunterfahren nicht aufgerufen.
Application.Current.Shutdown()
wird die Anwendung sofort herunterfahren, wie wenn der Vorgang in der Taskleiste abgeschlossen ist. Das ist wie jemanden zu erschießen, bevor er sein letztes Wort sagt :) .. würde ich nicht empfehlen.Ich bin froh, dass Sie Ihre Antwort erhalten haben, aber für andere werde ich auch Ihre Frage beantworten, um einige Informationen hinzuzufügen.
Schritt 1
Wenn Sie möchten, dass Ihr Programm beim Schließen des Hauptfensters beendet wird, müssen Sie zunächst angeben, dass dies nicht WinForms ist, bei dem dieses Verhalten standardmäßig verwendet wird.
(Die Standardeinstellung in WPF ist, wenn das letzte Fenster geschlossen wird.)
In Code
Gehen Sie zu Ihrer Anwendungsinstanz in Ihrem Einstiegspunkt (in VS 2012 WPF - Programm ist die Standard - verschachtelte innen
App.xaml
, also gehen Sie innerhalb es und navigieren Sie zuApp.xaml.cs
und einen Konstruktor erstellen).Im Konstruktor angeben , dass Ihre
Application
‚sShutdownMode
sein sollteShutdownMode
.OnLastWindowClose
.public App() { ShutdownMode = ShutdownMode.OnLastWindowClose; }
In XAML
Gehen Sie zu Ihrer
App.xaml
Datei , dass VS 2012 standardmäßig erstellt (oder erstellen Sie es selbst) Die Wurzel ist einApplication
, geben Sie im Inneren , dass IhrApplication
‚sShutdownMode
sein sollteShutdownMode
.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">
Wenn es funktioniert, sind Sie fertig; Sie können aufhören zu lesen.
Schritt 2
Wenn das oben genannte nicht funktioniert hat (ich denke, Sie haben die WPF-Anwendung von Grund auf neu geschrieben), ist das Hauptfenster der Anwendung wahrscheinlich nicht als Hauptfenster bekannt. Geben Sie dies auch an.
In Code
Gehen Sie wie in Schritt 1 zum Konstruktor der Anwendung und geben Sie dies an
Application
.MainWindow
Der Wert ist IhrWindow
:In XAML
Gehen
Application
Sie wie in Schritt 1 zur XAML und geben Sie dies anApplication
.MainWindow
Der Wert ist IhrWindow
:MainWindow = "mainWindow";
Alternative
Ich glaube nicht , das ist der beste Ansatz ist, nur weil WPF nicht , dass Sie dies tun will (so hat es
Application
‚sShutdownMode
), aber man kann nur ein Ereignis / außer Kraft eine Event - Methode (OnEventHappened) verwenden.Gehen Sie zur CodeBehind-Datei des MainWindow und fügen Sie Folgendes hinzu:
protected override void OnClosed(EventArgs e) { base.OnClosed(e); App.Current.Shutdown(); }
quelle
MainWindow
auf die Instanz des Hauptfensters, setzenShutdownMode
aufShutdownMode.OnMainWindowClose
, AnrufMainWindow.Show()
in RückrufStartup
FallApp
. Dies ist die minimalste Lösung, die ich mir ausgedacht habe und die zumindest in .NET Core 3 mit WPF wie erwartet funktioniert.Da der Standardmodus zum Herunterfahren in einer WPF-Anwendung OnLastWindowClose ist, wird die Anwendung gestoppt, wenn das letzte Fenster geschlossen wird.
Wenn Sie ein neues Fensterobjekt instanziieren, wird es automatisch zur Liste der Fenster in der Anwendung hinzugefügt . Das Problem war also, dass Ihre Anwendung beim Start zwei Fenster erstellte - das MainWindow und das noch nicht angezeigte Window01 - und wenn Sie nur das MainWindow geschlossen haben, würde das Window01 Ihre Anwendung weiter ausführen.
Normalerweise erstellen Sie ein Fensterobjekt mit derselben Methode, mit der der ShowDialog aufgerufen wird, und Sie erstellen jedes Mal ein neues Fensterobjekt, wenn der Dialog angezeigt wird.
quelle
Ich bin bei der Suche nach etwas anderem auf diese Frage gestoßen und war überrascht, dass ich keine der vorgeschlagenen Antworten sehen konnte, über die gesprochen wurde
Window.Owner
.{ var newWindow = new AdditionalWindow(); newWindow.Owner = Window.GetWindow(this); // then later on show the window with Show() or ShowDialog() }
Ein Aufruf
Window.GetWindow(this)
ist sehr nützlich im Hinblick auf einer MVVM - Anwendung , wenn Sie weit unten auf der visuellen Struktur nicht zu wissen, wo man instanziiert wurde, kann es durch die Übermittlung von heißemFrameWork
Elemente ( zum BeispielUserContol
,Button
,Page
). Wenn Sie einen direkten Verweis auf das Fenster haben, verwenden Sie diesen oder sogar diesenApplication.Current.MainWindow
.Dies ist eine ziemlich leistungsstarke Beziehung, die eine Reihe nützlicher Vorteile bietet, die Sie möglicherweise zunächst nicht realisieren (vorausgesetzt, Sie haben keine separaten Fenster speziell codiert, um diese Beziehungen zu vermeiden).
Wenn wir Ihr Hauptfenster
MainWindow
und das zweite Fenster wieAdditionalWindow
damals nennen ...MainWindow
Willens wird ebenfalls minimiertAdditionalWindow
MainWindow
wird ebenfalls wiederhergestelltAdditionalWindow
MainWindow
wird geschlossenAdditionalWindow
, das SchließenAdditionalWindow
jedoch nichtMainWindow
AdditioanlWindow
wird nie "verloren" gehen unterMainWindow
, dhAddditionalWindow
immer obenMainWindow
in der Z-ReihenfolgeShow()
angezeigt , wenn Sie es früher angezeigt haben (sehr nützlich!)Wenn Sie diese Beziehung haben, wird das
Closing
Ereignis auf demAdditionalWindow
nicht aufgerufen, sodass Sie dieOwnedWindows
Sammlung manuell durchlaufen müssen . Beispiel: Erstellen Sie eine Möglichkeit, jedes Fenster über eine neue Schnittstelle oder eine Basisklassenmethode aufzurufen.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(); } }
quelle
Keiner der oben genannten Punkte hat für mich funktioniert, vielleicht weil unser Projekt Prism verwendet. So endete dies in der App.XAML.cs
protected override void OnExit(ExitEventArgs e) { base.OnExit(e); Process.GetCurrentProcess().Kill(); }
quelle
Es sieht aus wie etwas, auf das ich gestoßen bin, als ich ein zweites Fenster als Dialogfeld erstellt habe. Wenn das zweite Fenster geöffnet und dann geschlossen und dann das Hauptfenster geschlossen wurde, lief die App weiter (im Hintergrund). Ich habe Folgendes in meiner App.xaml hinzugefügt (oder bestätigt):
<Application x:Class="XXXXXXX.App" ... StartupUri="MainWindow.xaml" ShutdownMode="OnMainWindowClose"> <Application.MainWindow > <NavigationWindow Source="MainWindow.xaml" Visibility="Visible" /> </Application.MainWindow>
Keine Freude.
Also ging ich schließlich in meine "MainWindow.xaml" und fügte dem Fenster eine "Closed" -Eigenschaft hinzu, die zu einer "MainWind_Closed" -Methode ging, die wie folgt aussieht:
private void MainWind_Closed(object sender, EventArgs e) { foreach ( Window w in App.Current.Windows ) { if (w.DataContext != this) w.Close(); } }
Wenn Sie den Debugger durchlaufen, wird anscheinend nur das Fenster angezeigt, das ich als Dialogfeld erstellt habe. Mit anderen Worten, die foreach-Schleife findet nur ein Fenster - das Dialogfeld, nicht das Hauptfenster.
Ich hatte "this.Close ()" in der Methode ausgeführt, die den Dialog schloss, und ich hatte ein "dlgwin.Close ()", das nach dem "dlgwin.ShowDialog ()" kam, und das funktionierte nicht. Nicht einmal ein "dlgwin = null".
Warum sollte dieser Dialog ohne dieses zusätzliche Material nicht geschlossen werden? Naja. Das funktioniert.
quelle