プロジェクトを眺めてみよう
ユニバーサルWindowsアプリケーションのテンプレートは「空のアプリケーション」と「ハブアプリケーション」の2つがあります。
それぞれ2つのテンプレートを作成して、ユニバーサルWindowsアプリケーションの特徴を見てみましょう。
新しいアプリケーション
これまででもお馴染みの一番シンプルなテンプレートです。画面は1ページしかなく、画面には何もコントロールが配置されていない状態です。
ファイル構成
「新しいアプリケーション」テンプレートを作成した直後のフォルダ構成は以下のようになっています。
![空のアプリケーションの初期ファイル](http://cz-cdn.shoeisha.jp/static/images/article/7834/7834_04.gif)
アプリ名.Windows(Windows 8.1)プロジェクト
まずは「アプリ名.Windows(Windows 8.1)」という名前のプロジェクトがあります。これはWindows 8.1向けのストアアプリのプロジェクトです。
ストアアプリの同名「空のアプリケーション」でお馴染みのMainPage.xamlやPackage.appxmanifestファイル、Assetsフォルダなどがあります。しかし、プログラムのエントリーポイントとなるApp.xamlが存在しません。
アプリ名.WindowsPhone(Windows Phone 8.1)プロジェクト
こちらはWindows Phone 8.1向けのプロジェクトです。
Windows Runtimeとの共通化が進んだというだけあって、ファイル構成はほとんど同じです。設定ファイルもWindowsストアアプリと同じPackage.appxmanifestファイルとなっています。こちらもエントリーポイントとなるApp.xamlが存在しません。
アプリ名.Sharedプロジェクト
WindowsストアアプリとWindows Phoneとでコードや素材を共有するためのプロジェクトです。
このプロジェクト内のソースコードや画像はWindowsストアアプリ、Windows Phoneの2つのプロジェクトで利用することができます。Sharedプロジェクトの中に先ほど見つからなかったApp.xamlがあります。
App.xaml.cs
このファイルにはユニバーサルWindowsアプリケーションを作成する上でのヒントがいくつかあります。
まずは何よりこのファイルが共通で利用できるSharedに配置されている点。App.xaml.csにはアプリケーションの基本的な動作(初期化処理)や、OnSuspending(アプリが中断状態に移行するタイミングで呼ばれる)などのライフサイクルに関連するイベントハンドラーが記述できます。これはWindowsストアアプリとWindows Phoneがライフサイクルレベルでも共通部分が多いことを表しています。
それでもWindowsストアアプリの場合だけ実行したい処理や、Windows Phone固有の処理が出てくると思います。その場合は以下のようなifディレクティブを記述します。
#if WINDOWS_PHONE_APP private TransitionCollection transitions; #endif
逆にWindowsストアアプリのみ呼び出したい場合は「WINDOWS_APP」を指定します。
#if WINDOWS_APP System.Diagnostics.Debug.WriteLine("Windowsストアアプリのみ"); #endif
実行してみる
Windowsストアアプリ側をデバッグしたい(もしくはその逆でWindows Phoneアプリをデバッグしたい)場合は、ソリューションエクスプローラーのデバッグしたいプロジェクト名の上でマウスの右クリックから「スタートアッププロジェクトに設定」を選択します。
ハブアプリケーション
前回の記事で、Windowsストアアプリ8.1ではハブアプリケーションがプロジェクトテンプレートに追加されたということを紹介しました。ユニバーサルWindwosアプリケーションでもハブアプリケーションのプロジェクトテンプレートが選択でき、ファイル構成も非常に似通っています。
ファイル構成
各プロジェクト
アプリ名.Windowsプロジェクト、アプリ名.WindowsPhoneプロジェクト、アプリ名.Sharedプロジェクトがソリューション内に存在するのは空のアプリケーションと同様です。
ただし今回はすべてのプロジェクトにAssetsフォルダが存在します。このようにWindowsストアアプリ固有の素材、Windows Phone固有の素材、そして共通の素材というように分けることができます。
HubPage.xaml
HubPage.xamlではHubコントロールを利用して、複数のエリア(セクション)に区切ってコントロールを配置しています。
Windows PhoneでHubコントロールを用いると、従来のパノラマのような表現ができます。
![Windows PhoneのHubコントロール](http://cz-cdn.shoeisha.jp/static/images/article/7834/7834_07.gif)
このように表示は異なりますが、XAMLファイルの記述やコードビハインド(HubPage.xamlに対するHubPage.xaml.csという対になるcsファイル)の記述は驚くほど共通化されていることに驚くことでしょう。
SharedプロジェクトのCommonフォルダ
前回の記事でも紹介しましたが、Windowsストアアプリ8.1で空のアプリケーション以外の複数ページ構成のプロジェクトテンプレートを選択した場合、Commonフォルダに色々なユーティリティクラスが最初から用意されています。
ユニバーサルWindowsアプリケーションのSharedプロジェクトにもCommonフォルダが存在し、その中身は驚くほど共有化されています。
![SharedプロジェクトのCommonフォルダ](http://cz-cdn.shoeisha.jp/static/images/article/7834/7834_08.gif)
例えば、ページ遷移などを補助するNavigationHelper.csは、Windows Phone固有のハードウェアの戻るボタンを押された場合のイベントハンドラーがWindows Phone固有の処理として記述されているなど違いはありますが、ほとんどが共通化されています。
#if WINDOWS_PHONE_APP Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed; #else