Windows と Windows Phone を対象とするユニバーサル Windows アプリの構築

Applies to Windows and Windows Phone

Windows と Windows Phone のアプリを同時に作り、Visual Studio の 2 つのプロジェクト間でコード、ユーザー コントロール、スタイル、文字列などのアセットを共有できます。これにより、デバイスの種類ごとにアプリを作成、維持するための時間とコストが削減されます。

既に Windows ストア アプリがあれば、同じソリューションに Windows Phone ストア アプリを簡単に追加できます。同様に、Windows Phone アプリを先に作った場合も、Windows ストア アプリを簡単に追加できます。

ユニバーサル アプリ用のプロジェクト テンプレートは、Visual Studio 2013 Update 2 以降のインストール時にインストールされます。

Windows と Windows Phone を対象とするユニバーサル Windows アプリの開発

まず、[新しいプロジェクト] ダイアログ ボックスでユニバーサル アプリ用のプロジェクト テンプレートを選びます。

次のスクリーンショットは、現在 C# で使うことができるユニバーサル アプリ プロジェクト テンプレートを示しています。Visual C++ にも同様のユニバーサル アプリ用テンプレートがあります。

Visual Studio のユニバーサル プロジェクト テンプレート

ユニバーサル アプリ用テンプレートを選んでソリューションを作ると、ソリューション エクスプローラーに 3 つのプロジェクトが表示されます。

  1. Windows プロジェクト。
  2. Windows Phone プロジェクト。
  3. 共有プロジェクト。

次のスクリーン ショットは、Visual Studio で [空のアプリケーション (ユニバーサル アプリ)] のプロジェクト テンプレートを選んだときに作成されるソリューションを示しています。

ソリューション エクスプローラーの集約型プロジェクト

  • Windows ストア プロジェクトには、Windows を対象とする XAML ページとコードが含まれています。

  • Windows Phone プロジェクトには、Windows Phone を対象とする XAML ページとコードが含まれています。

  • 共有プロジェクトは、両方のプラットフォームで実行されるコードのコンテナーです。共有プロジェクトの内容は、Windows Phone プロジェクトと Windows ストア プロジェクトの両方、さらにそのビルド出力に自動的に追加されます。

ビルド: ソリューションをビルドすると、Microsoft Visual Studio により Windows Phone ストア アプリと Windows ストア アプリが作られます。共有プロジェクトからのビルド出力はありません。

スタートアップ プロジェクト: ソリューションを実行 (F5 キーを押すなど) したときに実行されるのは、スタートアップ プロジェクトとして選択されたプロジェクトです。スタートアップ プロジェクトを設定するには、ソリューション エクスプローラーでプロジェクト ノードを右クリックし、[スタートアップ プロジェクトに設定] を選びます。選んだプロジェクトがソリューション エクスプローラーに太字で表示されます。前のスクリーンショットでは、App1.Windows (Windows 8.1) がスタートアップ プロジェクトです。

デバッグ ターゲット:

  • Windows プロジェクトがスタートアップ プロジェクトに設定されている場合、[デバッグ ターゲット] ボックスの一覧に、Windows シミュレーターまたはローカル コンピューターに対応するオプションが表示されます。
  • Windows Phone プロジェクトがスタートアップ プロジェクトに設定されている場合は、デバイスや各種の電話のエミュレーターに対応するオプションがボックスの一覧に表示されます。
  • C++ の Windows Phone プロジェクトで [デバイス] オプションを表示し、物理デバイスにアプリを展開するには、ビルド構成を手動で ARM プラットフォームに設定する必要があります。Win32 構成は電話エミュレーター専用です。[プロジェクト]、[プロパティ]、[構成マネージャー]、[プラットフォーム] の順にクリックしてプラットフォームを設定してください。

ユニバーサル アプリ作成の概要

"空のアプリケーション" ではなく、"ハブ アプリ (ユニバーサル アプリ)" という名前のテンプレートを使って作り始めることを検討してください (ハブは、以前のバージョンの Windows Phone におけるパノラマに相当します)。ハブ アプリ テンプレートでは、3 つのページがあるアプリが作られます ハブ アプリ テンプレートは、[ユニバーサル アプリ] カテゴリの下にあります。ハブ アプリ プロジェクト テンプレートについて詳しくは、「Visual Studio テンプレート」をご覧ください。

次のスクリーンショットは、[新しいプロジェクト] ダイアログ ボックスで "ハブ アプリ" プロジェクト テンプレートを選んでいるところを示しています。

Visual Studio のハブ アプリ テンプレート

共有プロジェクトでのクロスプラットフォーム コードの記述

共有プロジェクトでは通常、両方のプラットフォームで実行されるコードを記述します。

プラットフォーム固有のコードのセクションを分離するには、#ifdef ディレクティブを使います。定数 WINDOWS_APPWINDOWS_PHONE_APP は、使いやすいように事前定義されています。C++ では、#if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP...#endif というディレクティブを使って Phone 固有のコードを分離します。

ファイルをドラッグ アンド ドロップして、いずれかのプラットフォーム固有プロジェクトから共有プロジェクトに移動するか、その逆を行って、コードの範囲を変えることができます。

プラットフォーム固有コードの識別と分離

共有プロジェクトでコードを記述すると、Visual Studio コード エディターでは一方のプラットフォームまたは他方のプラットフォームを対象とするコンテキストが使われます。C# では、コードを記述するとき表示される Intellisense は、コード エディターのコンテキストに固有のものです。つまり、Windows または Windows Phone に固有の Intellisense です。

次のスクリーンショットは、Visual Studio コード エディターのコンテキスト選択ドロップダウン リストを示しています。

コード エディターのコンテキスト切り替えドロップダウン リスト

どちらかのプラットフォームでサポートされていない API を共有コードで使うと、プロジェクトをビルドするときにこの API がエラー メッセージに示されます。ただし、プラットフォーム間共通の API が使われていることを確認するために、プロジェクトをビルドする必要はありません。コード エディターで以下のいずれかの確認を行ってください。

  • 警告アイコンと Intellisense テキストを確認します。

    次のスクリーン ショットは、Windows Phone ストア アプリでのみサポートされる型に対して表示される警告アイコンと Intellisense の例です。

    警告アイコンと Intellisense

  • ドロップダウン リストでエディター コンテキストを他のプラットフォームに切り替えます。選択されたプラットフォームでサポートされていない API の下に波線が表示されます。C++ では、他のプラットフォームでサポートされない API がある場合、コンテキストを切り替えたり、プロジェクトをビルドしたりしなくても、紫色の波線が表示されます。

プラットフォーム固有の API を特定したら、#ifdef ディレクティブを使ってそれらを共有コードに分離します。

Windows または Windows Phone のサポートの追加

Windows ストア アプリを既に公開している場合、そのコードの一部を再利用して、Windows Phone バージョンのアプリを公開することは簡単です。Windows Phone アプリから作り始めた場合も同様に、Windows タブレットとデスクトップをビルド対象とするようにソリューションを変更することができます。別の種類のデバイスのサポートを追加するには、ソリューション エクスプローラーでプロジェクトを右クリックし、[Windows Phone 8.1 の追加][Windows 8.1 の追加] を選びます。

Windows Phone 8.1 プロジェクトの追加

新しい Windows Phone プロジェクトまたは Windows ストア プロジェクトがソリューションに追加されます。さらに共有プロジェクトが追加されます。

次のスクリーン ショットは、既にある Windows ストア プロジェクトに Windows Phone プロジェクトを追加した後のソリューションを示しています。

ソリューションに追加された Phone プロジェクト

共有プロジェクトへのファイルの移動

アプリ間で共有したい任意のコードを共有プロジェクトに移動できます。たとえば、Visual Studio テンプレートを使ってアプリを作った場合、CommonDataModelStrings の各フォルダーを共有プロジェクトに移動することを検討します。この後で説明しますが、App.xaml も共有プロジェクトに移動できます。

  C++ では、プロジェクト間でファイルを移動しても、ファイル システム内でそれらが物理的に移動されることはありません。

次のスクリーンショットは、先ほど例に挙げたファイルとフォルダーを共有プロジェクトに移動した後のソリューションを示しています。

共有プロジェクトに移動されたファイル。

共有プロジェクトに移動したコードについてのコンパイラ エラーが発生することがあります。ほとんどのエラーは、新しいアプリ プロジェクトに、最初のプロジェクトと同じ一連の参照を設定することで解決できます。たとえば、サード パーティのライブラリに対するアセンブリ参照が Windows ストア アプリに含まれていた場合、それに関連するコードを共有フォルダーに移動したら、Windows Phone プロジェクトでも、そのサード パーティのライブラリを参照する必要があります。

次のスクリーン ショットは、両方のプロジェクトに追加された同じアセンブリ参照を示しています。

両方のプロジェクトに追加されたアセンブリ参照

Windows に固有の API が共有コードで使われている場合、#ifdef ディレクティブと WINDOWS_APP 定数を使ってそのコード セクションを分離します。Windows Phone 8.1 に固有のコードのセクションを分離するときは、WINDOWS_PHONE_APP 定数を使います。次のセクションでは、これらの定数を適用する方法のほか、C++ で使う定数についても取り上げます。

App.xaml の共有

ユニバーサル アプリ用の新しいソリューションを作成すると、Visual Studio の共有プロジェクトに App.xaml が配置されます。既にあるプロジェクトをユニバーサル アプリに変換するときは、共有プロジェクトに App.xaml を手動で移動してください。ファイルを移動した後、ページの "ビルド アクション" プロパティを ApplicationDefinition に設定する必要があります。

  1. ソリューション エクスプローラーの共有プロジェクトで、App.xaml ファイルを選びます。
  2. [表示][プロパティ ウィンドウ] の順に選びます。
  3. [プロパティ] ウィンドウで [ビルド アクション] ボックスの一覧の ApplicationDefinition を選びます。

さらに、アプリの最初のページを開く方法も決める必要があります。たとえば、ユニバーサル アプリの App.xaml ページで次のコードを使って、HubPage というページを開くことができます。このコードが正しく動作するためには、両方のプロジェクトに HubPage というページが含まれている必要があります。



if (!rootFrame.Navigate(typeof(HubPage)))
{
    throw new Exception(“Failed to create initial page”);
}

アプリごとに異なるスタート ページを使う場合は、次に示すように #ifdef ディレクティブを追加する必要があります。


#if WINDOWS_APP
                if (!rootFrame.Navigate(typeof(HubPage)))
#endif
#if WINDOWS_PHONE_APP
                if (!rootFrame.Navigate(typeof(WindowsPhoneStartPage)))
#endif
                {
                    throw new Exception("Failed to create initial page");
                }


最後に、App.xaml ファイルで定義されているすべてのスタイルに、両方の種類のアプリで使用できるリソースが使われていることを確認します。使われていない場合は、それらのスタイル定義を Windows ストアまたは Windows Phone プロジェクトに移動します。

関連トピック

Visual Studio を使ったユニバーサル XAML アプリの作成に関するページ
Azure Marketplace のデータを使うユニバーサル Windows アプリ
プラットフォーム間のコードの共有に関するページ
C#、VB、C++ のプロジェクト テンプレート

 

 

表示:
© 2014 Microsoft