Windows プロジェクトのセットアップ

既存の Xamarin.Forms ソリューションへの新しい Windows プロジェクトの追加

古い Xamarin.Forms ソリューション (または macOS で作成されたソリューション) には、ユニバーサル Windows プラットフォーム (UWP) アプリ プロジェクトがありません。 そのため、Windows 10 (UWP) アプリをビルドするには、UWP プロジェクトを手動で追加する必要があります。

ユニバーサル Windows プラットフォーム アプリを追加する

UWP アプリをビルドするには、Windows 10 上の Visual Studio 2019 をお勧めします。 ユニバーサル Windows プラットフォームの詳細については、ユニバーサル Windows プラットフォームの概要に関する記事を参照してください。

UWP は Xamarin.Forms 2.1 以降で使用でき、Xamarin.Forms.Maps は Xamarin.Forms 2.2 以降でサポートされています。

役立つヒントについては、トラブルシューティングのセクションを確認してください。

次の手順に従って、Windows 10 の携帯電話、タブレット、デスクトップで実行される UWP アプリを追加します。

1 . ソリューションを右クリックし、[追加] > [新しいプロジェクト...] を選び、[空のアプリ (ユニバーサル Windows)] プロジェクトを追加します。

Add New Project Dialog

2 . [新しいユニバーサル Windows プラットフォーム プロジェクト] ダイアログで、アプリが実行される Windows 10 の最小バージョンとターゲット バージョンを選びます。

New Universal Windows Platform Project Dialog

3. UWP プロジェクトを右クリックし、[NuGet パッケージの管理] を選択して、Xamarin.Forms パッケージを追加します。 ソリューション内の他のプロジェクトも同じバージョンの Xamarin.Forms パッケージに更新されていることを確認します。

4. [ビルド] > [構成マネージャー] ウィンドウで、新しい UWP プロジェクトがビルドされることを確認します (これは既定では起動しないと思われます)。 ユニバーサル プロジェクトの [ビルド] ボックスと [デプロイ] ボックスをオンにします。

Configuration Manager Window

5. プロジェクトを右クリックし、[追加] > [参照] を選び、Xamarin.Forms アプリケーション プロジェクト (.NET Standard または共有プロジェクト) への参照を作成します。

Reference Manager Dialog

6. UWP プロジェクトで、App.xaml.cs を編集して、OnLaunched メソッドの 52 行め付近に Init メソッド呼び出しを含めます。

// under this line
rootFrame.NavigationFailed += OnNavigationFailed;
// add this line
Xamarin.Forms.Forms.Init (e); // requires the `e` parameter

7. UWP プロジェクトで、MainPage.xaml を編集して、Page 要素に含まれる Grid を削除します。

8. MainPage.xaml で、Xamarin.Forms.Platform.UWP に対して新しい xmlns エントリを追加します。

xmlns:forms="using:Xamarin.Forms.Platform.UWP"

9. MainPage.xaml で、ルートの <Page 要素を <forms:WindowsPage に変更します。

<forms:WindowsPage
...
   xmlns:forms="using:Xamarin.Forms.Platform.UWP"
...
</forms:WindowsPage>

10. UWP プロジェクトで、MainPage.xaml.cs を編集して、クラス名の : Page 継承指定子を削除します (前の手順で行った変更により、WindowsPage から継承するようになるため)。

public sealed partial class MainPage  // REMOVE ": Page"

11. MainPage.xaml.cs で、MainPage コンストラクターに Xamarin.Forms アプリを起動する LoadApplication 呼び出しを追加します。

// below this existing line
this.InitializeComponent();
// add this line
LoadApplication(new YOUR_NAMESPACE.App());

Note

LoadApplication メソッドの引数は、.NET Standard プロジェクトに定義されている Xamarin.Forms.Application インスタンスです。

12. 既存のプラットフォーム プロジェクトから、必要なローカル リソース (イメージ ファイルなど) をすべて追加します。

トラブルシューティング

[.NET ネイティブ ツール チェーンでコンパイルする] を使用するときの "ターゲット呼び出し例外"

UWP アプリが複数のアセンブリを参照している (サード パーティ製のコントロール ライブラリ、またはアプリ自体が複数のライブラリに分割されているなど) 場合、Xamarin.Forms がそれらのアセンブリ (カスタム レンダラーなど) からオブジェクトを読み込むことができないことがあります。

これは、プロジェクトの [プロパティ] > [ビルド] > [全般] ウィンドウの UWP アプリに対するオプションである [.NET ネイティブ ツール チェーンでコンパイルする] を使用するときに発生する可能性があります。

これは、以下のコードに示すように、App.xaml.csForms.Init 呼び出しの UWP 固有のオーバーロードを使用して修正できます (ClassInOtherAssembly はコードが参照する実際のクラスに置き換える必要があります)。

// You'll need to add `using System.Reflection;`
List<Assembly> assembliesToInclude = new List<Assembly>();

// Now, add in all the assemblies your app uses
assembliesToInclude.Add(typeof (ClassInOtherAssembly).GetTypeInfo().Assembly);

// Also do this for all your other 3rd party libraries
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
// replaces Xamarin.Forms.Forms.Init(e);

ソリューション エクスプローラーの参照として追加したアセンブリごとに、直接参照または NuGet を使用してエントリを追加します。

依存関係サービスと .NET ネイティブ コンパイル

.NET ネイティブ コンパイルを使用したリリース ビルドは、メイン アプリ実行可能ファイルの外部 (別のプロジェクトやライブラリなど) で定義されている依存関係サービスを解決できない可能性があります。

DependencyService.Register<T>() メソッドを使用して、依存関係サービス クラスを手動で登録してください。 上記の例に基づく場合、次のように Register メソッドを追加します。

Xamarin.Forms.Forms.Init(e, assembliesToInclude);
Xamarin.Forms.DependencyService.Register<ClassInOtherAssembly>(); // add this