Windows 10
构建适用于 Windows 10 设备的 Windows 应用的简介
您将亲眼见证:一个可以在各种类型的 Windows 设备之间运行的 Windows OS。它具有一个启用真正的通用硬件驱动程序的设备平台以及一个启用真正的通用 Windows 应用的应用平台。这一耗费数年的工程成就意义深远。
在操作系统级别,这意味着单一、可维护的敏捷代码库。对于开发人员而言,它可以跨各类 Windows 设备提供统一、可靠的 API 外围应用,包括从诸如 Raspberry Pi 之类的物联网 (IoT) 到手机、Xbox、平板电脑、Surface Hub、笔记本电脑、电脑等(如 Microsoft HoloLens)的 Windows 设备。如图 1 所示,Windows 10 通过该通用应用平台 (UAP) 兑现了“一次编写,随处运行”的承诺。
图 1 通用应用平台跨所有 Windows 设备系列启用应用
Windows 10 之旅
Windows 的整合由来已久。让时光倒流回 2011 年,那个时候 Microsoft 拥有三个平台和三个操作系统。电脑和服务器操作系统是 Windows,基于 Windows NT 代码库构建。手机操作系统是 Windows Phone,这是 Windows CE 的衍生物,表面上看与 Windows NT 类似,但是一个不同的代码库。Xbox 360 操作系统是 Windows NT,但这也是一个不同的代码库并具有 10 年的历史且分叉繁多。
当时的 Microsoft 正在努力为所有平台打造一个通用的 Internet Explorer。没有任何 Windows 核心、没有 Windows 平台,也没有 UAP。这三个操作系统上的 Internet Explorer 实现很成功,但投入了相当大的工程量。
通过 Windows Phone 8,Windows NT OS 内核替代了手机上的 Windows CE。这一次整合将发展方向确定为实现单一代码库。尽管 Windows、Windows Phone 和 Xbox 360 全都在使用相同的内核,但各自的代码库仍不相同。2013 年 Xbox One 推出,通过使用它,操作系统核心与 Windows 8 实现了共享。您可以从中窥视到 Microsoft 对于统一代码库的决心,但其仍服务于三个不同的操作系统。
Windows 10 为将这三个系统与聚合工程工作结合在一起提供了机会。然而,在同一时间,技术的新应用要求添加更多 Windows 目标:IoT、Microsoft HoloLens、Surface Hub 以及未来的 Windows 设备系列成员。Windows 10 这个操作系统不仅要适用于 Windows、手机和 Xbox,还要适用于未来所有的平台。
Microsoft 做到了。Windows 10 变成一个可以在所有设备系列上运行的轻量型核心操作系统。这可不像“文件|另存为”那么简单。聪明的人们以孜孜不倦的努力在令人难以置信的时间内创造出一个工程奇迹。Windows 10 是支持 UAP 所必需的单一代码库。从此时开始,每一个 Microsoft 产品都将根据构成 Windows 10 的单一核心进行编写。
统一而不是一致将代码库合并为一个核心操作系统并不是意味着一个跨不同设备的 UI。Windows Phone 的界面布局巧妙、可单手操作并深受喜爱,这与 10 英尺的 Xbox 屏幕带来的体验完全不同。同样,Surface Hub、Microsoft HoloLens 和 Raspberry Pi 也是如此。它们通过独特的体验凸显了其价值所在。尽管如此,操作系统及其库、运行时和框架仍是一样的。设备平台和应用平台是一样的。然而,UI 和外壳程序功能是截然不同的并针对每个设备调整为正确的使用模型。这些是不同的。
从理论上讲,一些人可以启动此核心操作系统,甚至可以运行应用,但没有人这样做,因为它只是一个构建基块。为了正确地支持每一种外形规格,特定于设备的外壳程序组件将添加到核心操作系统 — 例如开始菜单、特定的 HID 支持以及启用特定于设备的功能(如桌面应用程序)所必需的任意部分和部件。这些额外的组件构建自基本的操作系统,形成了您视为是 Microsoft 产品(如 Windows、Server、Xbox 和 HoloLens)的不同操作系统 SKU。
一个应用平台这里有一个可以和朋友一起玩的有趣游戏。告诉他们您打算接受最新的 Microsoft 应用创新,但不会面向 Windows 10。怎么办?下一代 Windows 应用不会以操作系统为目标。相反,其将锁定应用平台。在 Windows 上,UAP 是确保可在每种 Windows 设备之间使用的一致的应用模型和 API 外围应用。
UAP 并不是一个运行时。Windows 应用,即便是以托管语言(如 Visual Basic 或 C#)编写,也可像其他任何应用一样编译为元数据。它不运行在运行时内。它不需要运行时。UAP 是一个跨设备的通用 API 外围应用,因此以 UAP 为目标就是以特定的一组 API 版本为目标。
值得指出的是,您构建 Windows 应用和游戏时使用的是您早已熟知的工具和技术。以托管语言编写的 Windows 应用仍喜欢使用 Microsoft.NET Framework,该框架本身就是一个接口、基类和 Helper 方法的集合。在面向 UAP 的托管应用中使用的完整 .NET Framework 的子集称为 .NET 核心。补充一点,面向 UAP 的应用中使用的大多数 API 都位于 Windows 运行时中,该运行时服务于所有语言,而不仅仅是托管语言。
它不只是 XAML 本文将向您演示一个 XAML 应用程序,但 DirectX 和 JavaScript 应用(Windows Web Apps)也受 UAP 支持,就像它们在 Windows 8 中一样。不过,XAML 应用的兴起令人期待。XAML 对于许多 Microsoft 平台至关重要 — Windows Presentation Foundation (WPF),浏览器中和 Windows Phone 上和现在的 Windows UI 平台(其最初代号为“Jupiter”)中的 Silverlight。
Microsoft Office 2016 现在是一个 UAP 应用系列。它使用何种 UI 技术?XAML。由于这一层关系,XAML 平台的丰富功能和控件可供 Microsoft 和第三方开发人员(比如您)在其 Windows 应用中使用。
Windows 桌面外壳程序引入了许多新功能,如开始菜单和操作中心。它使用何种 UI 技术?XAML。由于这一层关系,XAML 平台表现超凡,如果您使用它,则可为您提供具备次秒级性能的呈现功能。
遇到 XAML 后,Microsoft 的身心全部投入其中。许多重要的操作系统应用(如 Photos)和 MSN 应用(如健康与健身)均依赖于 XAML UI 平台来向每一位开发人员提供相同的丰富功能,这些功能可供开发人员在自己的 Windows 应用中使用。您也可以在 Microsoft 应用中看到您可以执行的操作。不只是 API 外围应用对于所有人而言都是一样的,XAML UI 平台也是如此。
对于软件开发人员的价值编写可以在所有设备上运行的应用还不够。若要向用户提供真正的价值,您的 Windows 应用需要能在不同设备上大放异彩。借助 UAP 的扩展性,您可以将特定于设备的代码包含在将在各个设备上运行的单一二进制文件中。
您获得的不只是一个单一采用 UAP 的二进制文件,您还将获得一个适用于任何内容(手机、平板电脑、桌面甚至是 Xbox 应用)的“应用商店”。体验得到了简化;货币化得以简化;监视市场成功的度量也得到了简化。
“应用商店”和平台的单一化可以让您恰当地部署资产。这意味着适用于 Xbox 体验的资产不会下推到手机。此外,UAP 中还保留了 Windows 8 中打包面向特定分辨率和比例的资产的功能。
一如既往,一切尽在您的掌握中。这只是因为 UAP 支持所有 Windows 设备,并不意味着您必须要这样。您只需选择自己的 Windows 应用将支持的设备系列。您的 Windows 应用是仅适用于手机、Xbox 还是 HoloLens,完全取决于您。Windows 应用商店会确保将您的应用交付至您选择的设备系列。
对于给您带来的价值而言,不仅覆盖范围得到了扩大,而且综合体验更加轻松简便。有一套您已熟知并喜爱的工具,包括 Visual Studio 和 Blend for Visual Studio。还有一组熟悉的语言,包括 JavaScript、.NET Framework(Visual Basic 或 C#)和 C++/CX。最终,您和您的团队都是使用已经熟知的工具和语言在构建 Windows 应用。
诸多考虑
能力越强,责任越大。UAP 支持 Windows 应用在所有类型的 Windows 设备上运行。这非常棒,但需要特别注意:不是每个设备都提供相同的用户体验。这意味着,尽管您可以在自己的 Web 应用程序中采用许多相同的响应式 Web 设计 (RWD) 技术,但您必须思考您的 Windows 应用工作流在用途不同的不同类型设备上该如何结束。UAP 只能在不同设备上提供支持,而要构建对所有人而言均是绝佳的用户体验,则取决于开发人员和设计人员。
Microsoft 提供了充足的工具,以帮助您构建响应式的自适应 Windows 应用。Visual Studio 可以在设计期间模拟纵横比、比例和大小。Visual Studio 还可以模拟(并且有时会仿真)特定设备目标,即使您没有该硬件。这样可以让您测试 Windows 应用并不断巧妙处理您的体验。
XAML 工具箱具有多个新控件和增强功能,可帮助您创建在各个设备和各种大小的屏幕上都能完美呈现的响应式自适应界面。例如,RelativePanel 对于 XAML 开发人员而言是一个新增功能。与所有其他布局控件(如 Grid 和 StackPanel)一样,它继承自 Panel,但允许设计人员和开发人员相对于其他子元素定位子元素。生成的 XAML 可视树在响应布局更改方面更易于呈现和操作。“视觉状态”是针对 XAML 开发人员的另一项增强,使得响应布局更改更加简捷。
这非常重要:创建面向多个设备的 Windows 应用并不意味着写入最低通用标准。用户界面是丰富的,功能集也是如此。运行时检查(使用 Windows.Foundation.Metadata.ApiInformation 命名空间)使您能够包含特定于设备的功能,帮助您的应用在每个设备上提供可能的最佳用户体验。新增功能和聚合的控件是您实现远大理想所需的构建基块。
Windows 应用剖析
现在,让我们看一下创建将跨任意设备系列运行的 Windows 应用所需的基本技术。我们假定您熟悉 Windows 8.1 Windows 运行时 (WinRT) XAML 应用开发。Windows 应用演变自这些应用。您可以通过 aka.ms/w8learn 在 Microsoft 虚拟学院上找到许多学习资源。这篇文章重点介绍了 UAP 中的新功能 — 适用于跨各设备系列运行 Windows 应用。
在 Visual Studio 2015 中,“新建项目”对话框中的“Templates/Visual C#/Windows Universal”节点包含多个项目模板:空白应用、类库和 Windows 运行时组件。空白应用模板用于构建 Windows 应用。类库和 Windows 运行时组件模板可用于封装 UI 和逻辑,以在其他项目中重用。类库支持非 UAP 应用,但仅限于托管语言;Windows 运行时组件可在多种语言(包括 JavaScript 和 C++/CX)间共享,但具有约束其公用 API 外围应用的规则。
对于此示例,请选择空白应用,如图 2 所示。
图 2 默认情况下,Windows 应用现在使用空白模板
所有其他模板在哪里?请考虑 Windows 8 随附的 Hub 应用模板。许多开发人员都在使用。许多开发人员都在复制它。这一大批“我也是”应用在 Windows 应用商店中带来了视觉上的一致性,但对于生态系统多样性毫无贡献可言。现在,空白应用模板处于舞台中央,鼓励开发人员在该平台上打造视觉一致而独特的界面。许多基于社区的模板已开始出现在 Visual Studio 库中,其中包括 Template10,这是本文作者编写的。
Hello World! 您已创建了您的第一个 Windows 应用。尽管用户界面是空的,但它已经可以在所有 Windows 设备上运行。Visual Studio 解决方案资源管理器将揭示一个基本 Windows 应用是多么的简单:一个具有 App.xaml 的项目与一个针对初始用户界面的 MainPage.xaml 文件。
您的解决方案将包括其他熟悉的支持文件。Package.appxmanifest 声明应用将从用户的计算机请求的功能,如用户的位置、访问照相机以及文件系统。XML 架构已得到扩展,但与 Windows 8.1 通用应用的 appxmanifest 相同。
两个头在哪里?Windows 8 通用应用需要一部手机和 Windows 头项目。UAP 不需要多个头。相反,您可以改写您的界面以适应您的 Windows 应用要运行的任何位置。不过,如果适合您的开发团队工作流,您当然可以创建一个多头解决方案。两种方法都受支持。
包含内容 打开 MainPage.xaml 时,您会看到改进的 Visual Studio XAML 设计时体验。该设计器更丰富、更快;模拟纵横比和比例的功能得到了改进;工具本身得到了扩展。现在,让我们添加一点 XAML,如图 3 所示。(感谢我们的同事 David Crawford 提供了本示例。)
图 3 RelativePanel 允许您以简单的方式布局界面
<Grid Background="{StaticResource EggshellBrush}">
<RelativePanel x:Name="PromoArea">
<Image x:Name="BannerImage" HorizontalAlignment="Right"
Height="280" Stretch="UniformToFill"
Source="Assets/clouds.png"
RelativePanel.AlignRightWithPanel="True"/>
<Grid x:Name="BannerText" Margin="24"
Background="{StaticResource BlueBrush}">
<StackPanel Margin="12" HorizontalAlignment="Stretch">
<TextBlock x:Name="Headline" Text="Come fly with us"
Margin="0,-32,0,0" FontSize="48"
Foreground="{StaticResource EggshellBrush}"
FontFamily="{StaticResource LustScriptFont}" />
<TextBlock x:Name="Subtitle" FontSize="21.333"
Foreground="{StaticResource EggshellBrush}"
FontFamily="{StaticResource DomusTitlingFont}">
<Run Text="Fly return to London"/>
<LineBreak/>
<Run Text="For only $800"/>
</TextBlock>
</StackPanel>
</Grid>
</RelativePanel>
</Grid>
图 3 中的代码将为虚构航空公司的简单应用创建页眉。具体而言,它将利用新的 XAML RelativePanel,以便您可以采用一种简单方法重新排列该界面。RelativePanel 会将横幅图像定位到页面的右侧,并包括内含航空公司最新特殊优惠的网格。
添加一些资产 XAML 将引用三个我们已添加到 Assets 文件夹中的文件 — 一个图像文件 (Clouds.png) 和两个自定义字体(DomusTitlingFont.ttf 和 LustScriptFont.ttf)。字体和自定义画笔资源在 App.xaml 中声明:
<Application.Resources>
<SolidColorBrush x:Key="BlueBrush" Color="#FF1C90D1"/>
<SolidColorBrush x:Key="EggshellBrush" Color="#FFFAFFF7"/>
<FontFamily x:Key="LustScriptFont">
Assets/Fonts/LustScriptDisplay.otf#Lust Script Display
</FontFamily>
<FontFamily x:Key="DomusTitlingFont">
Assets/Fonts/DomusTitling.otf#Domus Titling
</FontFamily>
</Application.Resources>
这些文件均包含在本文附带的代码下载中。
请注意,位图图像的比例是统一的。如果您想要适应具有更高分辨率的设备,可以使用适当的比例系数缩放您的资产并进行命名,以便每个用户都会获得最佳视觉体验,而无需下载其他比例系数的资产。
在设备上运行 返回到 MainPage.xaml 中,用户界面已成型。若要运行该应用,您可以在 Visual Studio 设备目标下拉列表中选择目标。请注意,其中包括 Windows 模拟器(用于触摸测试)、本地计算机、远程计算机(用于测试 ARM)和设备(真正的手机硬件)。手机仿真程序位于相同的列表中。选择在“本地计算机”上运行,而后在手机仿真程序之一上运行,以看看您的 Windows 应用是否无需任何特殊编译即可在不同的设备上运行。
您可能已经注意到,在“本地计算机”(换言之,即您电脑的桌面)上运行 Windows 应用是一种窗口体验而不是 Windows 8 的全屏体验。这是因为您在 Windows 10 的桌面 SKU 上运行着您的应用。Windows 10 的移动 SKU 仍然会启动 Windows 应用全屏,以使触摸导航更容易。但是,如果您选择通过平板电脑或可转换便携式计算机上的 Continuum 界面提供触摸体验,则 Windows 10 的桌面 SKU 也将启动 Windows 应用全屏。
自适应界面 尽管该 Windows 应用可在这两种设备上运行,但如果仔细观察,用户界面在手机的较小屏幕上表现并不出色。标题文本对于较小屏幕来说,因为太大而被截断。测试并改进该 Windows 应用在各种可能设备上的用户体验是一个比较漫长的过程,而这仅仅是个开始。
当检测到更窄的手机屏幕时,我们需要修改标题的布局。但是,我们需要认识到的重要一点是,要检测的对象不是手机而是它的屏幕宽度。这允许在台式机和手机上提供窄屏体验。
请注意,没有用来检测手机的 API。然而,如果您的设计需要特定于手机和较小平板电脑的单手操作,您可以在自定义视觉状态触发器(这不属于本文探讨范围)中针对物理设备的对角线尺寸进行测试。
视觉状态并不是 XAML 的新增功能。视觉状态管理器允许开发人员和设计人员定义不同的视觉状态(指不同的屏幕布局)并于运行时在它们之间进行切换。视觉状态自适应触发器是 UAP 的新增功能。通过这些触发器,我们可以不再通过编程方法进行视觉状态的切换。而是,您在视觉状态应在 XAML 中可见时进行声明即可,基础平台将完成其余工作。
现在,修改 MainPage.XAML 中的 XAML,如图 4 所示。
图 4 XAML 现在支持声明规则以适应界面
<Grid Background="{StaticResource EggshellBrush}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="WindowStates">
<VisualState x:Name="NarrowState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="1"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="BannerImage.Height" Value="120"/>
<Setter Target="BannerText.(RelativePanel.Below)"
Value="BannerImage"/>
<Setter Target="BannerText.Width" Value="660"/>
<Setter Target="BannerText.Margin" Value="0,0,0,24"/>
<Setter Target="Headline.FontSize" Value="28"/>
<Setter Target="Subtitle.FontSize" Value="12"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="MediumState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="660"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="BannerImage.Height" Value="180" />
<Setter Target="BannerText.(RelativePanel.AlignTopWith)"
Value="BannerImage"/>
<Setter Target="Headline.FontSize" Value="28"/>
<Setter Target="Subtitle.FontSize" Value="14"/>
</VisualState.Setters>
</VisualState>
<VisualState x:Name="WideState">
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="1000"/>
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="BannerText.(RelativePanel.AlignTopWith)"
Value="BannerImage"/>
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<RelativePanel...
在图 4 中,注意有三个视觉状态进行了声明:NarrowState、WideState 和 MediumState。这些视觉状态中的每一个都对应着不同范围的屏幕宽度。您可以根据需要自由创建或多或少的视觉状态,以支持您的目标设备系列。每个视觉状态的名称并不重要。
XAML 还演示了视觉状态资源库,这是 UAP 中的新增功能,允许您在无情节提要动画开销的情况下设置不连续的属性值。此处,我们将使用资源库更改 RelativePanel 中子元素的相对位置(通过设置子元素上的 RelativePanel 附加属性),我们还要更改 BannerImage 的高度与文本元素的 FontSize。视觉状态就绪后,该界面可以出色地适应较窄的屏幕。试试看吧!
图 5 显示了 UI 如何适应屏幕宽度的变化。在 Windows 应用中,您可以利用视觉状态触发器来以任何最能满足您用户需求的方式调整元素。
图 5 不断适应屏幕宽度变化
在此示例的完整版本(包含在本文附带的代码下载中)中,用户界面得到了进一步的开发,并给出了使用 RelativePanel 和视觉状态触发器实施自适应 UI 的其他示例。
自适应代码 UI 适应不同的屏幕,但设备的差异远远不止屏幕大小。例如,手机上诸如后退和照相机之类的硬件按钮可能不会出现在不同的平台(如电脑)上。默认 UAP 具有大部分 Windows 应用需要的 API 外围应用,但特定于设备的功能则是通过您添加至项目的扩展 SDK 解锁(如外部附件),如图 6 所示。它们支持更广泛的特定于设备的功能集,但不会影响您的应用在其他类型设备上运行的能力。
图 6 添加扩展就像添加项目引用一样简单
两个最常见的平台扩展 SDK 是台式机和移动扩展,它们支持各自 Windows SKU 所特有的功能。例如,移动扩展支持使用硬件照相机按钮所需的 API。
Windows 移动 SKU 可以在手机和小型平板电脑上运行。但是,并非所有平板电脑(甚至并非所有所有手机)都具有硬件照相机按钮。扩展 SDK 支持使用按钮,但不会将按钮放置在设备上。因此,在运行时,您必须在调用扩展 SDK 中的功能之前,测试设备功能。
正如平台扩展 SDK(如移动和桌面 SDK)针对 Windows 应用解锁设备功能一样,自定义扩展 SDK 添加针对额外组件(如 Kinect for Windows 或第三方硬件)的支持。这些也不会阻止您的应用在其他类型的设备上运行。
如何检查设备功能?利用 Windows.Foundation.Metadata.ApiInformation 类中的方法,如果当前设备支持类型或方法则返回一个简单布尔值。您可以让您的 Windows 应用通过类似以下的代码使用“照相机”按钮:
if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent(
"Windows.Phone.UI.Input.HardwareButtons"))
{
Windows.Phone.UI.Input.HardwareButtons.CameraPressed +=
HardwareButtons_CameraPressed;
}
此处请注意,仅当设备上启用扩展 SDK 时,方可执行 Windows.Phone.UI.Input.HardwareButtons 代码。与编译条件不同,对功能的测试不会生成多个二进制文件。这意味着,您可以根据当前设备的功能打造更出色的用户体验或舒缓地降级用户体验。这是一个支持单个二级制文件的强大方法;它可创造出无限变化,让您在不同的设备系列上充分利用您的 Windows 应用。
总结
如果您对于 Windows 8 通用应用开发得心应手,那么构建面向 UAP 的 Windows 应用会让您有种在家烹饪的感觉。Windows 应用并不是面向 Windows 10;UAP 才是其目标,它已从 Windows SKU 中脱离。UAP 版本的递增与 Windows 完全脱钩。这意味着,Windows 应用无需每次都要重新锁定 Windows OS 版本。Windows 应用面向一个或多个 UAP 版本,并像测试设备功能那样测试这些功能。这一灵活的方法使您能够以绝佳的、干净的方式利用未来的功能。
构建 Windows 应用意味着您的应用可以在任何 Windows 设备上运行。这一好处在现实中有一点需要特别注意:UAP 可以运行您的应用,但仅开发人员和设计人员可调整 UI 和代码,以提供可能的最佳用户体验。如果想要生成单独的特定于设备的二进制文件,这没有问题。但是,您应该选择构建支持多设备类型的 Windows 应用,所有工具和基础结构都处于就绪状态,并随时准备保证您取得成功。
Jerry Nixon 是来自科罗拉多州的 Microsoft 开发推广人员。Nixon 的教授并演讲与 Windows、手机和桌面开发相关的内容。他的职业生涯从 Microsoft SQL Server 6.5 开始,在“数据库开发人员”还是一个新颖的词的时候,实现了以数据为中心的解决方案。在他开始为一家初创公司(之后成为 Microsoft CRM)工作之前,他曾因为安全工作方面的贡献而获得平民海军嘉奖。15 年来,Nixon 构建了以 Microsoft 为中心的移动解决方案。现在,他在各种活动、社区以及大学中发表着关于 XAML 和移动性的演讲,他的大部分业余时间都花在了给三个女儿讲述《星际迷航》中的角色背景故事和分集剧情。
Andy Wigley 是来自英国的 Microsoft 开发推广人员。他于 2012 年加入 Microsoft,在此之前他是一名咨询顾问,并且是移动应用开发人员社区的重要成员。他对于连续 10 年荣获 Microsoft 最有价值专家 (MVP) 称号倍感自豪。Wigley 是因为热门视频《Windows Phone 快速入门》(可从channel9.msdn.com 获取)而被大家所熟知,并很乐意与 Jerry Nixon 一起就 Windows 应用开发的后续视频系列进行合作。