オルタナティブ・ブログ > IT's my business >

IT業界のコメントマニアが始めるブログ。いつまで続くのか?

(XAML#09)「メインウィンドウを閉じたときにアプリケーションを終了させる」

»

Windows フォームを使っているときは、アプリケーションが複数の(モードレス)ウィンドウを使う場合でも、メインウィンドウを閉じたときにアプリケーションは終了しました。WPF アプリケーションでは、複数のウィンドウが表示されている場合、最初に表示したウィンドウを閉じても、他のウィンドウが閉じるまでアプリケーションは終了しません。

たとえば、MainWindow のコンストラクタで、次のように書いておくと、このウィンドウを読み込んだ時に、「Dynamic Window」というタイトルの新しいウィンドウが表示されます。メインウィンドウを閉じても、「Dynamic Window」は残ったままです。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // Loaded イベントハンドラーを匿名メソッドで割り当てる
        Loaded += delegate(object sender, RoutedEventArgs e)
        {
            var wnd = new Window();
            wnd.Title = "Dynamic Window";
            wnd.Show();
        };
    }
    ...

これは、Application の ShutdownMode プロパティがデフォルトでは OnLastWindowClose(最後のウィンドウが閉じたときに終了する)に設定されているためです。これを OnMainWindowClose(メインウィンドウが閉じたときに終了する)に変更すれば、Windows フォームの場合と同じように、メインウィンドウを閉じたときにアプリケーションが終了します。

このプロパティは App.xaml で定義するのが簡単です。

<Application x:Class="WpfApp1.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="MainWindow.xaml"
    ShutdownMode="OnMainWindowClose">
    <Application.Resources>

    </Application.Resources>
</Application>

※メインウィンドウを変更したい場合は、この定義中の StartupUri を変更してください。

ShutdownMode プロパティには、もうひとつ OnExplicitShutdown という設定があります。これを設定すると、ウィンドウを閉じただけではアプリケーションが終了しなくなります。終了条件を設定し忘れると、デバッグの停止やタスクマネージャで強制終了させる必要があるので注意してください。

Xaml9

Comment(0)