设置 Windows 项目

将新的 Windows 项目添加到现有的 Xamarin.Forms 解决方案

较旧的 Xamarin.Forms 解决方案(或在 macOS 上创建的解决方案)没有通用 Windows 平台 (UWP) 应用项目。 因此,需要手动添加 UWP 项目来生成 Windows 10 (UWP) 应用。

添加通用 Windows 平台应用

建议使用 Windows 10 上的 Visual Studio 2019 来生成 UWP 应用。 有关通用 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,在第 52 行两侧的 OnLaunched 方法内包含 Init 方法调用

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

7. 在 UWP 项目中,通过删除 Page 元素中包含的 Grid 来编辑 MainPage.xaml

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 构造函数中添加 LoadApplication 调用以启动 Xamarin.Forms 应用:

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

注意

LoadApplication 方法的参数是 .NET Standard 项目中定义的 Xamarin.Forms.Application 实例。

12. 从现有平台项目中添加所需的任何本地资源(例如图像文件)。

疑难解答

使用“使用.NET Native 工具链进行编译”时出现“目标调用异常”

如果 UWP 应用引用多个程序集(例如第三方控件库,或者应用本身分为多个库),则 Xamarin.Forms 可能无法从这些程序集中加载对象(例如自定义渲染器)。

使用“使用 .NET Native 工具链进行编译”时可能会出现这种情况,该工具链是项目的“属性”>“生成”>“常规”窗口中 UWP 应用的一个选项

可以通过在 App.xaml.cs 中使用 UWP 特定的 Forms.Init 调用重载来修复此问题,如以下代码所示(应将 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 Native 编译

使用 .NET Native 编译进行版本生成可能无法解析在主应用可执行文件外部(例如在单独的项目或库中)定义的依赖项服务。

使用 DependencyService.Register<T>() 方法手动注册依赖项服务类。 根据上面的示例,请如下所示添加 register 方法:

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