前のトピックは、名前空間とクラス マッピングでした。
移植プロセスを開始するには、Visual Studio で新しい Windows 10 プロジェクトを作成し、ファイルをコピーします。
プロジェクトを作成してファイルをコピーする
- Microsoft Visual Studio 2015 を起動し、新しい空のアプリケーション (Windows ユニバーサル) プロジェクトを作成します。 詳細については、「テンプレート (C#、C++、Visual Basic)を使用して Windows Runtime 8.x アプリをすぐに起動
」を参照してください。 新しいプロジェクトは、すべてのデバイス ファミリで実行されるアプリ パッケージ (appx ファイル) をビルドします。 - Windows Phone Silverlight アプリ プロジェクトで、再利用するすべてのソース コード ファイルとビジュアル アセット ファイルを特定します。 エクスプローラーを使用して、データ モデルをコピーし、モデル、ビジュアル アセット、リソース ディクショナリ、フォルダー構造、再利用するその他のものを新しいプロジェクトにコピーします。 必要に応じて、ディスク上にサブフォルダーをコピーまたは作成します。
- ビュー (MainPage.xaml や MainPage.xaml.cs など) も新しいプロジェクト ノードにコピーします。 ここでも、必要に応じて新しいサブフォルダーを作成し、プロジェクトから既存のビューを削除します。 ただし、Visual Studio によって生成されたビューを過剰に書き込んだり削除したりする前に、後で参照すると便利な場合があるため、コピーを保持しておいてください。 Windows Phone Silverlight アプリを移植する最初のフェーズでは、1 つのデバイス ファミリで見た目が良く、適切に動作するようにすることに重点を置いています。 後で、ビューがすべてのフォーム ファクターに適していることを確認し、必要に応じて、特定のデバイス ファミリから最大限に活用するためのアダプティブ コードを追加することに注意します。
-
ソリューション エクスプローラーで、[すべてのファイルの表示] がオンになっていることを確認します。 コピーしたファイルを選択して右クリックし、[プロジェクトに含める]
クリックします。 これには、含まれているフォルダーが自動的に含まれます。 必要に応じて、[すべてのファイルを表示] をオフに切り替えることができます。 必要に応じて、Visual Studio ソリューション エクスプローラーに必要なサブフォルダーを作成して、[既存の項目の追加] コマンドを使用することもできます。 ビジュアルアセットの [ビルド アクション] が [コンテンツ] に設定され、[出力ディレクトリにコピー [をコピーしない] に設定されていることを再確認します。 - 名前空間とクラス名の違いにより、この段階で多くのビルド エラーが発生します。 たとえば、Visual Studio によって生成されたビューを開くと、
型であり、PhoneApplicationPageページ ではないことがわかります。 この移植ガイドの次のトピックで詳しく説明する XAML マークアップと命令型コードの違いは多数あります。 ただし、XAML マークアップの名前空間プレフィックス宣言で "clr-namespace" を "using" に変更する、という一般的な手順に従うだけで、すばやく進められます。名前空間とクラス マッピング トピックと Visual Studio の Find and Replace コマンドを使用して、ソース コードを一括変更します (たとえば、"System.Windows" を "Windows.UI.Xaml" に置き換えます)。Visual Studio の命令型コード エディターでは、コンテキスト メニューの Resolve コマンドと Organize Usings コマンドを使用して、より対象を絞った変更を行います。
拡張機能ソフトウェア開発キット (SDK)
移植されたアプリが呼び出すユニバーサル Windows プラットフォーム (UWP) API のほとんどは、ユニバーサル デバイス ファミリと呼ばれる一連の API に実装されます。 ただし、一部は拡張機能 SDK に実装されており、Visual Studio では、アプリのターゲット デバイス ファミリまたは参照している拡張機能 SDK によって実装された API のみが認識されます。
見つからなかった名前空間または型またはメンバーに関するコンパイル エラーが発生した場合は、これが原因である可能性があります。 API リファレンス ドキュメントで API のトピックを開き、[要件] セクションに移動します。このセクションでは、実装するデバイス ファミリが何であるかを示します。 ターゲット デバイス ファミリではない場合は、API をプロジェクトで使用できるようにするには、そのデバイス ファミリの拡張 SDK への参照が必要です。
プロジェクト>[参照の追加]>Windows ユニバーサル>拡張機能 をクリックし、適切な拡張機能 SDK を選択します。 たとえば、呼び出す API がモバイル デバイス ファミリでのみ使用でき、バージョン 10.0.x.y で導入された場合は、UWP
これで、プロジェクト ファイルに次の参照が追加されます。
<ItemGroup>
<SDKReference Include="WindowsMobile, Version=10.0.x.y">
<Name>Windows Mobile Extensions for the UWP</Name>
</SDKReference>
</ItemGroup>
名前とバージョン番号は、SDK のインストール場所にあるフォルダーと一致します。 たとえば、上記の情報は次のフォルダー名と一致します。
\Program Files (x86)\Windows Kits\10\Extension SDKs\WindowsMobile\10.0.x.y
アプリが API を実装するデバイス ファミリを対象としていない限り、API を呼び出す前に、ApiInformation クラスを使用して、API の存在をテストする必要があります (これはアダプティブ コードと呼ばれます)。 その後、この条件はアプリが実行されるすべての場所で評価されますが、API が存在して呼び出し可能であるデバイスでのみ「真」として評価されます。 ユニバーサル API が存在するかどうかを最初に確認した後でのみ、拡張 SDK とアダプティブ コードを使用します。 以下のセクションでは、いくつかの例を示します。
また、アプリ パッケージ マニフェストの
マークアップとコードの再利用の最大化
リファクタリングを少し行ったり、アダプティブ コード (以下で説明) を追加したりすると、すべてのデバイス ファミリで動作するマークアップとコードを最大化できます。 詳細は次のとおりです。
- すべてのデバイス ファミリに共通のファイルには、特別な考慮事項は必要ありません。 これらのファイルは、アプリが実行されているすべてのデバイス ファミリでアプリによって使用されます。 これには、XAML マークアップ ファイル、命令型ソース コード ファイル、アセット ファイルが含まれます。
- アプリで実行されているデバイス ファミリを検出し、そのデバイス ファミリ専用に設計されたビューに移動することができます。 詳細については、「でアプリが実行されているプラットフォームの検出」を参照してください。
- 別の方法がない場合に役立つ同様の手法は、マークアップ ファイルまたは ResourceDictionary ファイル (またはファイルを含むフォルダー) に特別な名前を付け、アプリが特定のデバイス ファミリで実行されている場合にのみ実行時に自動的に読み込まれるような特殊な名前を付ける方法です。 この手法は、Bookstore1 ケース スタディに示されています。
- すべてのデバイス ファミリで使用できない機能 (プリンター、スキャナー、カメラ ボタンなど) を使用するには、アダプティブ コードを記述できます。 このトピックの 条件付きコンパイルとアダプティブ コード の 3 番目の例を参照してください。
- Windows Phone Silverlight と Windows 10 の両方をサポートする場合は、プロジェクト間でソース コード ファイルを共有できる場合があります。 方法は次のとおりです。Visual Studio で、ソリューション エクスプローラーのでプロジェクト
右クリックし、[既存の項目の追加] 選択し、共有するファイルを選択して、[リンクとして追加] クリックします。 ソース コード ファイルをファイル システム上の共通フォルダーに格納します。このフォルダーには、リンク先のプロジェクトが表示されます。ソース 管理に追加することを忘れないでください。 命令型のソース コードを考慮して、すべてではないにしても、ファイルの大部分が両方のプラットフォームで動作するようにできる場合は、そのコピーを 2 つ用意する必要はありません。 可能な場合は条件付きコンパイル ディレクティブ内のファイル、または必要に応じて実行時の条件で、プラットフォーム固有のロジックをラップできます。 次のセクションと、C# プリプロセッサ ディレクティブを参照してください。 - ソース コード レベルではなくバイナリ レベルで再利用するために、Windows Phone Silverlight で使用できる .NET API のサブセットと、Windows 10 アプリ (.NET Core) のサブセットをサポートするポータブル クラス ライブラリがあります。 ポータブル クラス ライブラリ アセンブリは、これらの .NET プラットフォームなどとバイナリ互換性があります。 Visual Studio を使用して、ポータブル クラス ライブラリを対象とするプロジェクトを作成します。 ポータブル クラス ライブラリを使用したクロスプラットフォーム開発の
を参照してください。
条件付きコンパイルとアダプティブ コード
1 つのコード ファイルで Windows Phone Silverlight と Windows 10 の両方をサポートする場合は、それを行うことができます。 プロジェクトのプロパティ ページで Windows 10 プロジェクトを見ると、プロジェクトで条件付きコンパイル シンボルとしてWINDOWS_UAPが定義されていることがわかります。 一般に、次のロジックを使用して条件付きコンパイルを実行できます。
#if WINDOWS_UAP
// Code that you want to compile into the Windows 10/11 app.
#else
// Code that you want to compile into the Windows Phone Silverlight app.
#endif // WINDOWS_UAP
Windows Phone Silverlight アプリと Windows ランタイム 8.x アプリの間で共有しているコードがある場合は、次のようなロジックを含むソース コードが既にある可能性があります。
#if NETFX_CORE
// Code that you want to compile into the Windows Runtime 8.x app.
#else
// Code that you want to compile into the Windows Phone Silverlight app.
#endif // NETFX_CORE
その場合は、Windows 10 をサポートする必要がある場合は、それも実行できます。
#if WINDOWS_UAP
// Code that you want to compile into the Windows 10/11 app.
#else
#if NETFX_CORE
// Code that you want to compile into the Windows Runtime 8.x app.
#else
// Code that you want to compile into the Windows Phone Silverlight app.
#endif // NETFX_CORE
#endif // WINDOWS_UAP
条件付きコンパイルを使用して、ハードウェアの戻るボタンの処理を Windows Phone に制限している可能性があります。 Windows 10 では、戻るボタン イベントはユニバーサル概念です。 ハードウェアまたはソフトウェアに実装されているすべての戻るボタンは、BackRequested イベントを発生させるので、それを処理する必要があります。
Windows.UI.Core.SystemNavigationManager.GetForCurrentView().BackRequested +=
this.ViewModelLocator_BackRequested;
...
private void ViewModelLocator_BackRequested(object sender, Windows.UI.Core.BackRequestedEventArgs e)
{
// Handle the event.
}
条件付きコンパイルを使用して、ハードウェア カメラ ボタンの処理を Windows Phone に制限している可能性があります。 Windows 10 では、ハードウェア カメラ ボタンはモバイル デバイス ファミリに特有の概念です。 1 つのアプリ パッケージがすべてのデバイスで実行されるため、アダプティブ コードと呼ばれるものを使用して、コンパイル時の条件を実行時条件に変更します。 そのためには、ApiInformation クラスを使用して、実行時にクエリを実行して、HardwareButtons クラスが存在することを確認します。 HardwareButtons はモバイル拡張機能 SDK で定義されているため、このコードをコンパイルするには、その SDK への参照をプロジェクトに追加する必要があります。 ただし、ハンドラーは、モバイル拡張機能 SDK で定義されている型を実装するデバイスでのみ実行され、それがモバイル デバイス ファミリであることに注意してください。 したがって、次のコードは、条件付きコンパイルとは異なる方法で実現されますが、存在する機能のみを使用するように注意してください。
// Note: Cache the value instead of querying it more than once.
bool isHardwareButtonsAPIPresent = Windows.Foundation.Metadata.ApiInformation.IsTypePresent
("Windows.Phone.UI.Input.HardwareButtons");
if (isHardwareButtonsAPIPresent)
{
Windows.Phone.UI.Input.HardwareButtons.CameraPressed +=
this.HardwareButtons_CameraPressed;
}
...
private void HardwareButtons_CameraPressed(object sender, Windows.Phone.UI.Input.CameraEventArgs e)
{
// Handle the event.
}
また、「でアプリが実行されているプラットフォームを検出する」を参照してください。
アプリ パッケージ マニフェスト
プロジェクトの設定 (拡張 SDK 参照を含む) によって、アプリが呼び出すことができる API の領域が決まります。 ただし、アプリ パッケージ マニフェストは、顧客がストアからアプリをインストールできるデバイスの実際のセットを決定するものです。 詳細については、「TargetDeviceFamilyの例」を参照してください。
アプリ パッケージ マニフェストを編集する方法については、次のトピックで、一部の機能に必要なさまざまな宣言、機能、およびその他の設定での使用について説明しているため、理解する価値があります。 Visual Studio アプリ パッケージ マニフェスト エディターを使用して編集できます。
ソリューション エクスプローラー が表示されない場合は、表示 メニューからそれを選択します。
Package.appxmanifestをダブルクリックします。 マニフェスト エディター ウィンドウが開きます。 適切なタブを選択して変更を加え、変更を保存します。 移植されたアプリ マニフェストの
Windows 10のパッケージ マニフェスト スキーマ リファレンス
次のトピックは トラブルシューティングです。