扉絵。
WPF アプリケーションの開始と終了について学びます。
まずは Main 関数を探してみましょう。
VisualStudio より新規で WPF アプリケーションを作成した場合、ソリューションエクスプローラは
次のようになっています。
探してみてわかると思いますが、どこにも Main 関数は見当たりません。
ビルドを行うとプロジェクト直下に obj フォルダが作成されると思います。
この中の生成物を調べていくと App.g.cs というファイルが見つかると思います。
そのファイルに Main 関数が書かれています。
見つけました! Main 関数です。
ここがエントリポイントです。
最初に App クラスインスタンスを作成し、初期化処理の後、Run 関数を呼び出します。
アプリケーション実行中は Run 関数は制御を返しません。(次の行へ抜けないということ)
ウィンドウを閉じるなど、シャットダウンを行うと Run 関数が終了します。
これがアプリケーションの始まりと終わり、ライフタイムです。
われわれ開発者が初期化コードを実行するタイミングは Run を呼び出した後の Startup イベントが起きたときです。
Run 関数が実行され、制御を返すまでにどんなイベントが起きるのか見てみましょう。
Run 関数の開始
Application.Startup イベント
Window の作成(ユーザーコード)
Application.Shutdown 関数
Application.Exit イベント
Run 関数の終了
なるほど、基本としてこの順番は覚えておこうと思います。
つい先ほど Run 関数で記述した 「Window の作成(ユーザーコード)」について説明します。
アプリケーションを作成すると、勝手に作られる次のコード↓
メインのウィンドウは Window クラスを継承して作成されていますね。
このメインウィンドウが作成されてユーザーの操作を受け付けるループに入ります。
具体的にどんなイベントの流れが起きるのか見てみましょう。
上記のコードに書かているコンストラクタが呼ばれる。
Initialized イベント
Activated イベント
Loaded イベント
ContentRendered イベント
ユーザーの操作の受付(この間に別ウィンドウにフォーカスを移すと Deactevated イベントが起きる。)
Closing イベント
Unloaded イベント
Closed イベント
簡単に解説すると ContentRenderd イベントでユーザーに見えるようになります。
ユーザーから見えない間に初期化したい場合は Loaded イベントを使います。
Closing イベントは閉じようとしているときに起きます。
このイベントで、「閉じる前に保存しますか?」メッセージを表示することが多いようですね。
で、気になるのが、アプリケーションがいつ終わるのか、なのです。
このメインウィンドウが閉じられると終了する他に、次に示すモードが選択できるようです。
具体的には Application の ShatdownMode に次に挙げるものを設定することで反映されます。
OnLastWindowClose (最後のウィンドウが閉じられたときにシャットダウン)
OnMainWindowClose (一般的なやつ。メインウィンドウが閉じられたらシャットダウン)
OnExplicitShutdown (ShutDown 関数が呼ばれない限り、アプリを終了しない。)
試してみましょう。
App.xaml にハイライトした一行を加えます。
メインウィンドウが閉じられても、次に示すようにプロセスが生き続けます。
ユーザーにはあたかも閉じられたかのように見せることができるので
常駐させる用途のアプリにはこのモードがもってこいですね。
次のように、Closed イベントハンドラでシャットダウンして、アプリケーションが終了することも確認できました。
アプリケーションの始まりと終わりに関する部分を確かめてみました。
どこに Main 関数があるのかはっきりしないととっつきづらいものです。
今回のお話で少しでも理解の助けになれば幸いです。
2012/04/12 初記。
2012/04/22 更新。