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)] プロジェクトを追加します。
2 . [新しいユニバーサル Windows プラットフォーム プロジェクト] ダイアログで、アプリが実行される Windows 10 の最小バージョンとターゲット バージョンを選びます。
3. UWP プロジェクトを右クリックし、[NuGet パッケージの管理] を選択して、Xamarin.Forms パッケージを追加します。 ソリューション内の他のプロジェクトも同じバージョンの Xamarin.Forms パッケージに更新されていることを確認します。
4. [ビルド] > [構成マネージャー] ウィンドウで、新しい UWP プロジェクトがビルドされることを確認します (これは既定では起動しないと思われます)。 ユニバーサル プロジェクトの [ビルド] ボックスと [デプロイ] ボックスをオンにします。
5. プロジェクトを右クリックし、[追加] > [参照] を選び、Xamarin.Forms アプリケーション プロジェクト (.NET Standard または共有プロジェクト) への参照を作成します。
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.cs の Forms.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