1. ホーム
  2. c#

[解決済み] メインウィンドウを閉じてもWPFアプリがシャットダウンしない

2023-04-04 07:55:30

質問

私はVisual StudioでWinFormsのプログラミングに慣れていますが、WPFを試してみたくなりました。

私は自分のプロジェクトにWindow01という別のウィンドウを追加しました。メインウィンドウは MainWindow と呼ばれます。の前に public MainWindow() コンストラクタの前に Window01 を宣言しています。

Window01 w1;

さて、このウィンドウをインスタンス化すると

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    w1 = new Window01();            
}

ウィンドウが表示されるボタンがあります。 w1.ShowDialog(); .

ここで「おかしい」のは、アプリケーションを (デバッグ付きで) 起動し、数秒後に終了した場合 (私はアプリケーションで何もしていません)、Visual Studio はアプリケーションがまだ実行されているかのようにデバッグを停止しない、という事実です。

私が行を移動すると w1 = new Window01(); のすぐ上、つまりボタンのクリックメソッドに移動すると ShowDialog() を追加すると、Visual Studio は適切に動作します。つまり、アプリケーションを終了すると、デバッグが停止します。

なぜこのような奇妙な動作になるのでしょうか。

どのように解決するのですか?

あなたの MainWindow.xaml.cs で、これを実行してみてください。

protected override void OnClosed(EventArgs e)
{
    base.OnClosed(e);

    Application.Current.Shutdown();
}

このリンク先では ShutdownMode を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>

アプリケーションの実行を停止するのは Shutdown メソッドの Application メソッドが呼び出されます。シャットダウンは暗黙的または明示的に行われ、それは ShutdownMode プロパティの値によって指定されます。

もしあなたが ShutdownMode から OnLastWindowClose Windows Presentation Foundation (WPF) は、アプリケーションの最後のウィンドウが閉じると、現在インスタンス化されているウィンドウがメイン ウィンドウとして設定されていても (MainWindow 参照)、暗黙のうちに Shutdown を呼び出すようになっています。

A ShutdownModeOnMainWindowClose を使用すると、他のウィンドウが現在開いている場合でも、MainWindow が閉じるときに WPF が暗黙的に Shutdown を呼び出すようになります。

一部のアプリケーションの寿命は、メインウィンドウまたは最後のウィンドウがいつ閉じられるかに依存しないか、またはウィンドウにまったく依存しない場合があります。このようなシナリオの場合は ShutdownMode プロパティに OnExplicitShutdown のように、明示的な Shutdown メソッド呼び出しが必要です。そうでなければ、アプリケーションはバックグラウンドで実行され続けます。

ShutdownMode は、XAML から宣言的に、またはコードからプログラム的に設定することができます。

このプロパティは Application オブジェクトを作成したスレッドからのみ利用可能です。


あなたの場合、アプリが終了しないのは、おそらくデフォルトの OnLastWindowClose :

もし ShutdownMode から OnLastWindowClose に設定されている場合でも、WPF はアプリケーションの最後のウィンドウが閉じると、暗黙のうちに Shutdown を呼び出します。 MainWindow ).

新しいウィンドウを開いていて、閉じていないので、シャットダウンは呼び出されません。