vGamePadのAppクラスについて



はじめに

Visual StudioでWPFのアプリケーションを作成すると、System.Windows.Applicationクラスを親に持つAppクラスというオブジェクトが生成されます。
Appクラスのクラスダイアグラム
(vGamePadではAppクラスにIDisposableインターフェースをMutex解放のために持たせてます)
このAppクラスがいわゆるWPFのメイン関数のような存在となります。

App.xaml.csはC#のソースコードなので理解しやすいと思いますが、App.xamlはXML形式のファイルなので少し慣れが必要かもしれません。

vGamePadのAppクラス

まずはvGamePadのApp.xamlです。

<Application x:Class="UserInterface.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Startup="Application_Startup"
             Exit="Application_Exit"
             DispatcherUnhandledException="Application_DispatcherUnhandledException"
             ShutdownMode="OnMainWindowClose">
    <Application.Resources>
    </Application.Resources>
</Application>

おまじない的な記述はスルーしまして、xamlを分解して対応するAppクラスのメソッドなど説明していきます。

Application.Startupイベント

いわゆる前処理になりますが、5つの処理を行っています。

private void Application_Startup(object sender, StartupEventArgs e)
{
}
  1. タッチスクリーン機能の有無チェック
    この実装はデバイスがデジタイザー入力に対応しているかどうかを調べる(ぐらばくさんのブログ)を参考にさせていただいてます。
  2. マルチコアJITの設定
  3. 重複起動の排除
    System.Threading.Mutexクラスを使って実装
  4. UIスレッド以外で発生した例外を補足するためのイベントハンドラの登録
    参照:AppDomain.UnhandledExceptionイベント
  5. ゲームパッド画面の表示
    通常、Application.StartupUriプロパティに初期画面のMainWindow.xamlが指定されているはずですが、チェックロジックなど起動に条件が必要な場合、App.xamlからその記述を削除し直接App.xaml.csに記述します。

    MainWindow = new MainWindow();
    MainWindow.Show();
    

    このApplication.MainWindowプロパティがメイン画面の実態になります。

Application.Exitイベント

vGamePadの終了処理です。

private void Application_Exit(object sender, ExitEventArgs e)
{
}

実際は終了時に行うことはあまりなく、二重起動防止のミューテックス解放と設定情報の保存だけです。

Application.DispatcherUnhandledExceptionイベント

UIスレッドの例外処理のハンドラです。

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
    // 例外内容を表示、保存する
    e.Handled = true;
    Shutdown(-1);
}

ここに例外情報を表示したりログに書き込む処理を記述しておけばOKです。

Application.ShutdownModeプロパティ

このプロパティはアプリケーションの終了方法を指定します。
vGamePadではメイン画面をクローズすることでアプリケーションが終了するよう動作してほしいため”OnMainWindowClose”を設定しています。
詳細はShutdownMode列挙体を参照してください。


Leave a comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です