你可以构建可在多个 Windows 设备上运行的应用。
如果你面向 Windows 8.1 设备,则将具有一种解决方案,但将构建两个不同的应用。你将为一台 PC 或平板电脑构建一个应用,为 Windows Phone 构建一个应用。因为你可以在这些应用之间共享大部分代码,所以术语通用表示共享你的代码。
如果你面向 Windows 10 设备,则也将具有一种解决方案,但将构建一个可在所有 Windows 10 设备上运行的应用,因此术语通用表示你共享几乎所有内容。
若要构建面向 Windows 8.1 设备的 Windows 跨平台应用,请安装 Microsoft Visual Studio 2013 或 Microsoft Visual Studio 2015 Preview 或最新的 Visual Studio 2015 CTP。请参阅获取工具。
若要构建面向 Windows 10 设备的 Windows 跨平台应用,请安装 Windows 10 Technical Preview 工具。
构建面向 Windows 8.1 设备的 Windows 跨平台应用
可以同时构建适用于 Windows 和 Windows Phone 的应用,并在 Visual Studio 中的两个项目之间共享代码、用户控件、样式、字符串以及其他资产。这会减少为每种类型的设备构建和维护应用的相关时间和费用。
如果你已拥有 Windows 应用商店应用,你可以轻松地将 Windows Phone 应用商店应用添加到相同的解决方案。同样,如果你在开始时创建了 Windows Phone 应用,可以轻松地添加 Windows 应用商店应用。
当你安装 Visual Studio 2013 Update 2 或更高版本时,Windows 跨平台应用的项目模板也将随之安装。
本部分内容
开始编写 Windows 跨平台应用
若要开始,请在“新建项目”对话框中为 Windows 跨平台应用选取项目模板。
以下屏幕截图显示了当前可用于 C# 的 Windows 跨平台应用项目模板。Visual C++ 具有一组相似的适用于 Windows 跨平台应用的模板。
当为 Windows 跨平台应用选择模板并创建解决方案时,“解决方案资源管理器”中会出现三个项目。
- Windows 项目。
- Windows Phone 项目。
- 共享项目。
以下屏幕截图显示当你为“空白应用(通用应用)”选择项目模板时,Visual Studio 创建的解决方案。
-
Windows 应用商店项目包含面向 Windows 的 XAML 页面和代码。
-
Windows Phone 项目包含面向 Windows Phone 的 XAML 页面和代码。
-
共享项目是在这两个平台上运行的代码的容器。共享项目的内容自动包含在 Windows Phone 和 Windows 应用商店项目及其构建输出中。
构建。当你构建解决方案时,Microsoft Visual Studio 会构建 Windows Phone 应用商店应用和 Windows 应用商店应用。共享项目没有构建输出。
启动项目。当你运行解决方案时(例如通过按“F5”),运行的项目是选为启动项目的项目。要设置启动项目,请右键单击“解决方案资源管理器”中的项目节点,然后选择“设置为启动项目”。所选项目以粗体的形式显示在“解决方案资源管理器”中。在之前的屏幕截图中,“App1.Windows (Windows 8.1)”是启动项目。
调试目标。
- 当 Windows 项目是启动项目时,“调试目标”下拉列表将显示 Windows“模拟器”或“本地计算机”的选项。
- 当手机项目是启动项目时,下拉列表将显示“设备”以及各种手机模拟器的选项。
- 在 C++ 手机项目中,你必须将构建配置手动设置为 ARM 平台,以便查看“设备”选项并将该应用部署到物理设备。Win32 配置仅用于手机模拟器。通过导航到“项目|属性|配置管理器|平台”设置该平台。
请考虑从名为“中心应用(通用应用)”的模板(而不是“空白应用程序”)开始编写。(中心应用相当于以前版本 Windows Phone 中的全景应用。)“中心应用”模板将创建具有三个页面的应用。你可以在“通用应用”类别下找到“中心应用”模板。要阅读关于“中心应用”项目模板的详细内容,请参阅 Visual Studio 模板。
以下屏幕截图显示在“新建项目”对话框中选中的“中心应用”项目模板。
编写共享项目中的跨平台代码
在共享项目中,你通常要编写在两个平台上运行的代码。
要隔离特定于平台的代码部分,请使用 #ifdef 指令。已为你方便地预定义了常数 WINDOWS_APP 和WINDOWS_PHONE_APP。(在 C++ 中,使用此指令隔离特定于 Windows Phone 的代码:#if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP...#endif
。)
你可以将文件从一个特定于平台的项目拖放到共享项目(反之亦然),以更改代码的作用域。
标识并隔离特定于平台的代码
当你在共享项目中编写代码时,Visual Studio 代码编辑器使用面向两个平台之一的上下文。在 C# 中,在编写代码时看到的 Intellisense 特定于代码编辑器的上下文,即特定于 Windows 或 Windows Phone。
以下屏幕截图显示了“导航”栏中的上下文切换器。
如果你在共享代码中使用在两个平台上不受支持的 API,在你构建项目时,一条错误消息将会标识该 API。但是,你无需构建项目以确认正在使用跨平台 API。在代码编辑器中检查以下内容之一。
-
查看警告图标和 Intellisense 文本。
以下屏幕截图显示警告图标和 Intellisense 的示例,适用于仅在 Windows Phone 应用商店应用中受支持的类型。
- 在上下文切换器中,将编辑器上下文切换到其他平台这将在选定平台不支持的 API 下方显示曲线。在 C++ 中,紫色曲线表示 API 在其他平台上不受支持,无需切换上下文或构建项目。
在标识特定于平台的 API 后,通过使用 #ifdef 指令在共享代码中隔离它们。
添加对 Windows 或 Windows Phone 的支持
如果你已发布 Windows 应用商店应用,可以很轻松地重复使用某些代码,并发布面向 Windows Phone 的应用版本。同样,如果你在开始时创建了 Windows Phone 应用,也可以修改你的解决方案以面向 Windows 平板电脑和台式电脑进行构建。要为任意一种类型的设备添加支持,请在解决方案资源管理器中右键单击项目并选择“添加 Windows Phone 8.1”或“添加 Windows 8.1”。
Visual Studio 向解决方案添加新的 Windows Phone 或 Windows 应用商店项目。Visual Studio 还会添加共享项目。
以下屏幕截图显示将 Windows Phone 项目添加到现有 Windows 应用商店项目之后的解决方案。
将文件移到共享项目
你可以将希望在应用之间共享的任何代码移到共享项目中。例如,如果你使用 Visual Studio 模板创建了应用,请考虑将“通用”、“DataModel”和“Strings”文件夹移到共享项目中。你甚至可以将“App.xaml”移动到共享项目中,如本主题中稍后所述。
以下屏幕截图显示将建议的文件和文件夹移动到共享项目后的解决方案。
你可能会收到有关你移动到共享项目中的代码的某些编译器错误。在许多情况下,你可以通过配置新应用项目以拥有与初始项目相同的引用集来解决这些错误。例如,如果 Windows 应用商店应用包含了第三方库的程序集引用,并且你将相关代码移动到“共享”文件夹中,那么你还必须在 Windows Phone 项目中引用此第三方库。
以下屏幕截图显示添加到这两个项目的相同程序集引用。
如果你的共享代码使用特定于 Windows 的 API,请使用 #ifdef 指令和 WINDOWS_APP 常量隔离此部分代码。使用WINDOWS_PHONE_APP 常量隔离特定于 Windows Phone 8.1 的代码部分。下一部分显示了如何应用这些常量,还提及了 C++ 中使用的常量。
共享 App.xaml
在为 Windows 跨平台应用创建新解决方案时,Visual Studio 将 App.xaml 放置在共享项目中。在将现有项目转换为 Windows 跨平台应用时,可以手动将 App.xaml 移动到共享项目中。在移动该文件后,你必须将页面的“构建操作”属性设置为“ApplicationDefinition”。
- 在“解决方案资源管理器”的共享项目中,选择“App.xaml”文件。
- 依次选择“视图”>“属性窗口”。
- 在“属性”窗口的“构建操作”下拉列表中,选择“ApplicationDefinition”。
你还必须决定如何打开应用的第一页。例如,Windows 跨平台应用的 App.xaml 页面可能使用以下代码打开名为 HubPage 的页面。此代码仅在两个项目都包含名为“HubPage”的页面时才起作用。
if (!rootFrame.Navigate(typeof(HubPage))) { throw new Exception(“Failed to create initial page”); }
如果你希望为每个应用使用不同的起始页,则必须添加“#ifdef”指令,如下所示:
#if WINDOWS_APP if (!rootFrame.Navigate(typeof(HubPage))) #endif #if WINDOWS_PHONE_APP if (!rootFrame.Navigate(typeof(WindowsPhoneStartPage))) #endif { throw new Exception("Failed to create initial page"); }
最后,确保 App.xaml 文件中定义的任何样式使用的都是在两种应用类型中可用的资源。否则,将这些样式定义移到 Windows 应用商店或 Windows Phone 项目中。
构建面向 Windows 10 设备的 Windows 跨平台应用
现在,你可以构建一个可在所有 Windows 10 设备上运行的应用,并设计你的页面,以便无论使用何种设备查看这些页面,它们都能正确呈现。如果你想要了解可能的情况,请查看 Windows 跨平台应用指南。然后,安装工具并构建你的第一个真正的通用 Windows 应用。
本部分内容
- 开始创建 Windows 跨平台应用
- 添加适应所有 Windows 10 设备屏幕大小、布局和分辨率的通用控件
- 预览你的页面针对不同类型的设备的显示方式
- 运行应用并调试代码
- 添加特定于平台的代码
- 控制页面元素针对不同的方向或屏幕尺寸的呈现方式
- 为页面创建特定于设备的视图
- 将 Windows 8.1 项目迁移到 Windows 10 项目
- 使用适用于 Windows 10 Technical Preview 的 Visual Studio 工具查找已知问题的解决方案
开始创建 Windows 跨平台应用
首先创建“空白应用程序 (UAP)”项目。
完成该操作后,请注意,只有一个项目会出现在“解决方案资源管理器”中。这是因为你的应用现在是真正自适应的,你仅需要一个项目来构建它。
该项目中包含一个页面,但你可以添加其他页面。每个页面都将在你项目面向的所有设备上呈现,因此你无需创建多个版本。如果你想要优化特定设备的页面体验,也完全可以。我们稍后再讨论。
添加适应所有 Windows 10 设备屏幕大小、布局和分辨率的通用控件
Windows 通用平台引入了一些可针对不同类型的设备、布局和设备方向调整其外观的新控件,如 RelativePanel 和SplitView 控件。
这些控件尚未出现在 Visual Studio 工具箱中,它们不会正确地呈现在 Visual Studio 设计器中,但你可以将其手动添加到 XAML 文件,然后运行应用以查看其在不同类型的设备中的显示方式。
预览你的页面针对不同类型的设备的显示方式
你可以在不运行应用的情况下,查看页面在不同类型的设备上的呈现方式。从设计器顶部的下拉列表中选择设备。 显示在设计器中的页面的尺寸随每个选择而更改。 你还可以选择是在横向还是纵向模式下查看你的页面。
在这些工具的当前版本中,仅一个小的设备外形规格列表会出现在下拉列表中,并且此特性的功能是受限的。但是,它们让你大致了解这些工具朝最终发布版本的发展方向。
运行应用并调试代码
若要运行应用,请从“标准”工具栏上的“本地计算机”按钮旁的下拉列表中选择设备目标。
若要查看你的应用在平板电脑或台式机上的显示方式,请从本地运行它,或者在远程计算机上或模拟器中运行它。模拟器帮助你模拟常见的触摸和旋转事件。
若要查看你的应用在手机上的显示方式,请选择一个手机模拟器或将设备直接连接到你的计算机。
进一步了解如何使用 Visual Studio 调试和测试你的应用
添加特定于平台的代码
你的大部分代码既可在电脑上也可在移动设备上运行。大多数情况下,你不必执行任何操作即可实现这一点。这是因为大多数 API 已聚合为一个“通用应用平台” SDK。你可以在你的项目引用列表中找到该 SDK,如下所示。
但是,有时,你需要编写仅可在移动设备上运行的代码。为此,请打开“引用管理器”对话框,然后选择“Windows Desktop 扩展 SDK”(适用于电脑)或“Windows Mobile 扩展 SDK”(适用于移动设备)。
在使用 API 之前,需要确保该 API 在运行的设备上可用。例如,此代码将事件处理程序分配给Windows.Phone.UI.Input.HardwareButtons.BackPressed 事件。因为你的项目中包含对“Windows Mobile 扩展 SDK”的引用,所以代码可以编译,但当用户在电脑上运行此应用时,会发生什么情况?
Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
由于电脑没有后退按钮,该应用会崩溃。
若要解决此问题,请使用 Windows.Foundation.Metadata.ApiInformation.IsTypePresent 方法来确定名为Windows.Phone.UI.Input.HardwareButtons 的类型在运行的设备上是否可用。如果可用,则应用是在移动设备上运行,代码将执行而不会导致应用崩溃。 为此,可使用以下代码。
if (Windows.Foundation.Metadata.ApiInformation.IsTypePresent("Windows.Phone.UI.Input.HardwareButtons")) Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;
在整个应用中使用此模式将特定于设备的功能添加到应用体验中。
控制页面元素针对不同的方向或屏幕尺寸的呈现方式
在 XAML 中使用设计状态,根据设备方向等内容指定控件应如何显示。
适用于 Windows 10 Technical Preview 的 Visual Studio 工具尚不具有可帮助你添加这些设计状态的功能,但你可以将它们直接添加到 XAML 文件中,然后运行应用以查看其行为。
为页面创建特定于设备的视图
有时,为了获得定制体验,你需要的不只是自适应控件和设计状态。但这只是小菜一碟。你可以为你的页面创建特定于设备的视图。因为它们共享相同的代码隐藏文件,所以它们不是单独的页面。
如设备状态一样,适用于 Windows 10 Technical Preview 的 Visual Studio 工具尚不具有可帮助你创建这些视图的功能,但你可以手动将其添加到项目中。
了解视图。
将 Windows 8.1 项目迁移到 Windows 10 Technical Preview 项目
如果你想要开始对任一现有 Windows 8.1 项目使用适用于 Windows 10 Technical Preview 的 Visual Studio 工具,则可以通过迁移项目来实现。虽然适用于 Windows 10 Technical Preview 的 Visual Studio 工具不支持迁移,但是你可以按照以下链接中所述步骤手动修改你的项目:
了解如何将 Windows 8.1 项目转换为 Windows 10 Technical Preview 项目。
使用适用于 Windows 10 Technical Preview 的 Visual Studio 工具查找已知问题的解决方案
与任何预览版本一样,在开始使用适用于 Windows 10 Technical Preview 的 Visual Studio 工具时,你很可能会遇到一些意外的行为。通过查看发行说明,你也许可以解决这些问题。
-
使用 Visual Studio 构建 Windows 跨平台应用
使用来自 Azure Marketplace 的数据的 Windows 跨平台应用
跨平台共享代码
C#、VB、和 C++ 项目模板