Connect(); 2016

第 31 卷,第 12 期

Xamarin - Xamarin 和通用 Windows 平台

作者:Tyler Whitney; 2016

如果以 iOS 和 Android 为目标使用 Xamarin,则应了解使用一种编程语言和共享代码开发多平台的好处。同时还应了解使用 Xamarin.Forms 的好处:在 Android 和 iOS 上重用 UI 的同时,保留利用独特平台功能的自由。

你或许还不知道,可以通用 Windows 平台 (UWP) 为目标使用这些相同的工具,将应用范围扩展到 4 亿多台设备,增加 iOS 和 Android 设备的下载量及参与度。

为什么以 UWP 为目标?

为什么应用要以 UWP 为目标? 应用的参与度 - 这就是原因所在。作为开发人员,我们想要实现这个目标。我们希望亲眼看到我们的内容。我们希望自己的应用有人在使用,而且是定期使用,以充分利用应用内购买、广告、内容发布来构建应用生态系统等。

通过 UWP,可以编写在台式计算机、平板电脑、手机、Xbox、HoloLens 和物联网 (IoT) 设备上运行的应用。为应用提供了超过 4 亿个潜在的套接字。但这不仅仅是基于 Windows 设备的数量,同时还是为了增强所有支持设备上的参与度。可以参考一下 NPR 的经验及其应用:NPR One (one.npr.org)。

NPR One 向其用户提供了一个包含公共广播新闻、故事和播客的策展流。指向 Windows 极大地增加了 NPR 内容的参与度。Microsoft 博客文章 (bit.ly/2e30plQ) 引用了NPR 产品经理 Ben Schein 的话,“70% 的 NPR 收听者使用 Windows 设备,我们发现仅从 Windows 10 面世以来它们的收听时间就增加了 50%。这是我们升级应用之前的数字。” 还有一个意想不到的收获,NPR 发现“……我们发布 Windows 应用后,iOS 和 Android 下载量也出现意外飙升。”

这说明我们生活在一个多设备世界中。我们知道人们有 iOS 和 Android 设备,知道他们在公司或家里有电脑。白天,他们会根据所在位置和所做的事情在这些设备之间切换,这点很重要。在所有这些设备上都安装上应用,这样人们就更有可能与应用和内容不断地进行互动。

设想在这样一个普通的日子,人们乘公共汽车去上班。在公共汽车上,她开始在手机上执行一项任务,例如查看报告。上班后,她可能想将报告导出到 Microsoft Excel,在台式计算机上继续对这项任务进行深入分析。坐公共汽车回家时,她可能开始看一个视频。到家后,她可能会换成 PC 或带 Xbox 的大屏幕客厅体验,并且想要继续观看停止的视频。

在上述每种情况下,涉及的不仅仅是应用可运行其上的设备,尽管这点很重要。同时还涉及用户尝试在设备上完成任务时,应用让他们在设备之间进行转换的情况如何,此时这点最重要。

UWP 是什么?

UWP 提供了一个通用的应用平台,适用于运行 Windows 10 的所有设备。

除了在所有基于 Windows 10 的设备上提供的一组通用 API 之外,特定于设备的 API 还可让你充分利用设备。我现在介绍一下 UWP 为开发人员提供的一些主要好处。

自适应和美观的 UI:UWP 旨在帮助应用适应不同的屏幕尺寸和输入类型。它提供 UI 控件和布局控件,以便适应正在运行它们的设备,无论是小型手机屏幕还是大型娱乐中心屏幕都可以。

图 1 显示了自适应 UI 的一个示例。请注意,移动设备上的通话按钮和画中画控件的位置。应用在手机上运行时,通话按钮的大小会更改,其位置也会进行调整,从而使用户可以更轻松地使用 UI。画中画控件的位置已在手机上进行调整以适合较小的屏幕。

自适应 UI
图 1 自适应 UI

内置控件接受设备上提供的输入类型,无论是触控输入、触笔、键盘、鼠标还是 Xbox 控制器都能使用。

可以通过新增的组合 API 编写美观的应用。另外,还可以创建动画(包括关键帧动画),以及应用效果(例如,投影、缩略图照明、模糊、不透明度、缩放动画效果、色调旋转、视差 ListView 项、Z 顺序滚动、棕褐色、对比度等)。通过在 GitHub (bit.ly/2e3PDqo) 上克隆和运行 WindowsUIDevLabs 项目,可以自己查看这些效果。

UWP 应用可以提供动态磁贴和通知(如图 2 所示),以便为应用提供一目了然的信息。动态磁贴和通知可将应用参与度提高多达 20%,因为它们可将用户吸引回应用。

动态磁贴和通知
图 2 动态磁贴和通知

自适应代码利用设备的优势 通过 UWP,你可以定制体验,以利用各种设备类型的优势。可以编写自适应代码,仅当应用在特定类型的设备上运行或将应用指向特定类型的设备时,才利用该设备的功能。Visual Studio 会从可用的 API 筛选出与指向的设备类别关联的 API。Windows 应用商店将可用应用的范围设定为所使用的设备类型。UWP 应用可在所有设备上使用。

Cortana API 提供了将语音命令添加到应用中的功能。在 Cortana 门户上注册应用操作时,Cortana 将在适当的时间和地点建议与你的应用相关的操作。

为了帮助你针对 UWP 编写具吸引力的应用,Visual Studio 提供了出色的编码和调试工具。这些资源可用于帮助你编写应用,例如代码示例 (bit.ly/1RhG46l)、任务代码片段 (bit.ly/2dINSo9);资源还包括一个充满活力的开发人员社区,你可以从中获得帮助,以及诸如 UWP 社区工具包 (bit.ly/2b1PAJY) 的库,可以为 Twitter 和 Facebook 提供动画、自定义控件和服务。然后,你可以生成一个可安装在所有基于 UWP 设备上的软件包。

将应用交付给客户时减少麻烦 Windows 应用商店通过使应用更容易分发给更广泛的受众群体,降低了每次安装的成本。它可以处理跨越地理边界的销售,你无需了解其他国家(地区)的银行基础设施和税法,同时减少到达自己以外地区的麻烦。Windows 应用商店还可处理在设备之间共享内容的应用许可,因此,你不必构建基础结构来处理这些问题。

此外,Windows 应用商店还提供你在应用商店中习惯的体验,例如自动更新、许可、试用等。它通过将你的应用提供给数以亿计的 Windows 10 用户,以实现巨大利润。

UWP 提供创建丰富应用的功能,在各种设备上运行它们并提供给你的客户使用。正如你将看到的,从 Xamarin 指向 UWP 并不难。

将 UWP 项目添加到现有的 Xamarin.Forms 应用

我将向你展示如何将一个 UWP 项目添加到 James Montemagno 在 GitHub (bit.ly/2dYHEvs) 上的股票代码示例,这是一个面向 iOS、Android 和 UWP 的 Xamarin.Forms 解决方案。

我假设你在 Windows 10 上运行的是 Visual Studio 2015 Update 3,并且 Xamarin 已安装且是最新版本。

如果要按照以下步骤操作,请克隆代码示例,删除 MyStocks.Forms.UWP 项目并通过以下步骤重新添加:

  1. 将 UWP 项目添加到现有的 Xamarin.Forms 解决方案。
  2. 将引用从 UWP 项目添加到 Xamarin.Forms。
  3. 将引用添加到包含共享窗体的可移植类库 (PCL)。
  4. 修改 UWP 项目中的代码以使用 Xamarin.Forms,然后从共享的 PCL 项目中加载应用。

让我们一次完成这些步骤。

将空白 UWP 添加到现有的 Xamarin.Forms 解决方案 将 MyStocks.Forms 解决方案加载到 Visual Studio 后,右键单击解决方案节点,然后选择“添加| 新建项目”。在“添加新项目”对话框中,导航到“Visual C# | Windows | 通用”,然后选择“空白应用(通用 Windows)”。将项目命名为 MyStocks.Forms.UWP,然后单击“确定”。

接下来,你将看到“新的通用 Windows 项目”对话框,它会要求你选择 UWP 应用将支持的最低平台版本。单击“确定”以选择默认值。

现在,已将 UWP 项目添加到 Xamarin 解决方案中,右键单击新的 UWP 项目的“引用”节点,然后选择“管理 NuGet 程序包”。

“NuGet 程序包”窗口出现时,请选择“浏览”,在搜索框中键入“forms”以缩小列表范围,然后从列表中选择 Xamarin.Forms。从右侧的下拉列表中选择最新的稳定版本,请记下它的版本,然后单击“安装”(参见图 3)。

NuGet 程序包管理器
图 3 NuGet 程序包管理器

确保项目指向相同的版本 如果解决方案中有其他 Xamarin.Forms 项目,请确保它们使用的是添加到 UWP 项目中的同一版本的 Xamarin.Forms。要查看其他项目正在使用的 Xamarin.Forms 版本,请选择一个项目(例如 MyStocks.Forms.Android),右键单击其“引用”节点并选择“管理 NuGet 程序包”。确保选中“已安装”,在搜索框中键入“forms”以缩小列表范围,然后在已安装的 NuGet 程序包列表中查找 Xamarin.Forms。验证此版本与在 MyStocks.UWP 项目中使用的 Xamarin.Forms 版本是否匹配。如果是较早版本,请更新它(请参见图 4)。

验证 Xamarin.Forms 版本是否匹配
图 4 验证 Xamarin.Forms 版本是否匹配

将引用添加到包含共享窗体的 PCL 希望 UWP 项目的 UI 使用 Xamarin.Forms 项目中的共享 UI。为此,新的 UWP 项目需要引用包含共享表单的 PCL。在 My.Stocks.Forms.UWP 项目中,右键单击“引用”节点,然后选择“添加引用”。在出现的“引用管理器”中,确保“项目 | 选择解决方案”处于选中状态,然后选择 MyStocks.Forms 以添加引用(请参见图 5)。

将引用添加到可移植类库
图 5 将引用添加到可移植类库

修改 UWP 项目中的代码以使用 Xamarin.Forms 和从共享的 PCL 项目中加载应用 现在,我需要替代应用模板中的代码,它是作为新的 UWP 项目的一部分添加的,因此,将使用 Xamarin.Forms 从共享的 PCL 项目中加载应用。将以下突出显示的代码插入到 App::OnLaunched 的开头,它在 MyStocks.Forms.UWP | App.xaml | App.xaml.cs 中:

protected override void OnLaunched(LaunchActivatedEventArgs e)
{
  // Initialize Xamarin.Forms here
  Xamarin.Forms.Forms.Init(e);
  #if DEBUG
  ...
}

在 MainPage 构造函数(在 MyStocks.Forms.UWP | MainPage.xaml | MainPage.xaml.cs 中)中,添加以下突出显示的代码,以加载 Xamarin.Forms 项目:

public MainPage()
{
  this.InitializeComponent();
  this.LoadApplication(new MyStocks.Forms.App());
}

在同一文件中,删除 MainPage 从 Page 继承的内容:

public sealed partial class MainPage : Page

然后对 MainPage.xaml (MyStocks.Forms.UWP | MainPage.xaml) 进行以下更改:

  • 在 <Page> 标记内部,添加 xmlns:forms=“using:Xamarin.Forms.Platform.UWP”:
<Page
    x:Class="MyStocks.Forms.UWP.MainPage"
    xmlns:forms="using:Xamarin.Forms.Platform.UWP"
    ...
  • 将开始 <Page> 标记更改为 <forms:WindowsPage,并确保结束标记从 </Page> 更改为 </forms:WindowsPage>

现在,该页面从 Xamarin.Forms.Platform.UWP.WindowsPage 继承。

将 MyStocks.Forms.UWP 项目添加到生成配置 将 UWP 项目添加到 Xamarin.Forms 项目后,请确保已将其配置为生成。首先,右键单击 MyStocks.Forms.UWP 项目节点,然后选择“设为启动”项目。

然后,右键单击解决方案节点并选择“配置管理器”。在“配置管理器”对话框中,确保选中了“生成”和“部署”的 MyStocks.Forms.UWP 复选框。

如果你已经按照这些步骤执行操作,则在最初已删除了 MyStocks.Forms.UWP 项目。新的 MyStocks.Forms.UWP 项目没有添加到原始项目的背景图像或 NuGet 程序包,以便获取股票代号的值,访问 Twitter API 等。要查看向 James Montemagno 的示例应用添加 UWP 项目所采取的步骤的结果,请在之前提供的链接中复制其 GitHub 项目的全新副本,或将以下 NuGet 程序包安装到 MyStocks.Forms.UWP 项目:linqtotwitter、Microsoft.Bcl、Microsoft.BCL.Build、Microsoft.Bcl.Compression、Microsoft.Net.Http、Newtonsoft.Json 和 Xam.Plugins.TextToSpeech。

现在已将 UWP 项目添加到 Xamarin 解决方案中。UWP 项目将从 UWP 空白应用模板中加载并运行 Xamarin.Forms 应用。图 6 显示了在 Android、iOS 和 Windows 10 上运行的应用。

在各种操作系统上运行的应用
图 6 在各种操作系统上运行的应用

Xamarin.Forms 执行将控件从共享窗体项目映射到添加的 UWP 项目的任务。Xamarin.Forms 还提供了一种方法来引入平台特异性,如果你需要,同时仍可以共享 UI 的其他部分。如需更多详细信息,请查看 Charles Petzold 这期的文章“Embedding Native Views in Your Xamarin.Forms Apps”(在 Xamarin.Forms 应用中嵌入本机视图),以及 Kevin Ashley 在 2016 年 9 月的文章“Cross-Platform Productivity with Xamarin”(bit.ly/2dYKr8a)(借助 Xamarin 提高跨平台工作效率)。

特定于 UWP 应用的功能,例如动态磁贴、自定义图标、通知等,将引入 UWP 项目。

总结

如果没有对 UI 使用 Xamarin.Forms,仍可以将 UWP 项目添加到解决方案。可以使用共享资产项目、PCL 或 .NET 标准库共享代码。有关最佳实践的信息,请参阅 Xamarin 开发人员网站 (bit.ly/2e3bV0C) 上的“Building Cross-Platform Applications”(构建跨平台应用程序)。

微软收购 Xamarin 之后,会继续投资开源项目 (bit.ly/1MZsCFE)。我们鼓励你提供反馈和投稿!


Tyler Whitney是 Microsoft 的高级内容开发人员。他撰写了关于 Windows Embedded Compact 的文章,现在正撰写关于 Windows 10 开发的文章。

衷心感谢以下 Microsoft 技术专家对本文的审阅: Jim Cox、Norm Estabrook、James Montemagno 和 Jason Short。Jim Cox 是 Microsoft 的首席项目经理。

Jason Short 是 Microsoft 高级项目经理。

James Montemagno 是 Microsoft 的 Xamarin 首席项目经理。

Norm Estabrook(Microsoft 的高级内容开发人员)。