从 Windows 运行时 8.x 移动到 UWP

如果你有通用 8.1 应用(无论是面向 Windows 8.1、Windows Phone 8.1 还是两者),则你会发现源代码和技能将顺利移植到 Windows 10。 借助 Windows 10,你可以创建通用 Windows 平台 (UWP) 应用,该应用是可供客户安装到各种设备的单个应用包。 有关 Windows 10、UWP 应用以及我们将在本移植指南中提及的自适应代码和自适应 UI 的概念的详细信息,请参阅 UWP 应用指南。

移植时,你会发现 Windows 10 与以前的平台以及 XAML 标记、UI 框架和工具共享大多数 API,你会发现这一切都令人放心地熟悉。 就像以前一样,你仍然可以在 C++、C# 和 Visual Basic 之间进行选择,以便将编程语言与 XAML UI 框架一起使用。 规划当前应用或应用的确切操作的第一步将取决于你拥有的应用和项目类型。 以下各节对此进行了说明。

如果你有通用 8.1 应用

通用 8.1 应用基于 8.1 通用应用项目生成。 假设该项目的名称是 AppName_81。 它包含这些子项目。

  • AppName_81.Windows。 这是为 Windows 8.1 生成应用包的项目。
  • AppName_81.WindowsPhone。 这是为 Windows Phone 8.1 生成应用包的项目。
  • AppName_81.Shared。 这是包含两个项目使用的源代码、标记文件和其他资产和资源的项目。

通常,在 Windows 8.1 和 Windows Phone 8.1 窗体中,8.1 通用 Windows 应用提供相同的功能,并使用相同的代码和标记。 此类应用是移植到面向通用设备系列的单个 Windows 10 应用的理想候选应用(并且可以安装在最广泛的设备上)。 你基本上要移植共享项目的内容,你需要从其他两个项目使用很少或什么,因为其中几乎没有或没有什么内容。

其他情况下,Windows 8.1 和/或 Windows Phone 8.1 形式的应用包含独特的功能。 或者它们包含相同的功能,但它们使用不同的技术或不同的技术实现这些功能。 有了这样的应用,可以选择将其移植到面向通用设备系列的单个应用(在这种情况下,你希望应用适应不同的设备),也可以选择将其移植为多个应用,可能是一个面向桌面设备系列,另一个面向移动设备系列。 通用 8.1 应用的性质将确定哪种选项最适合你的情况。

  1. 将共享项目的内容移植到面向通用设备系列的应用。 如果适用,请从 Windows 和 WindowsPhone 项目中抢救任何其他内容,并在应用中无条件使用该内容,或者在设备上无条件地使用该内容,即你的应用恰好在当时运行(后一种行为称为 自适应行为)。
  2. 将 WindowsPhone 项目的内容移植到面向通用设备系列的应用。 如果适用,请从 Windows 项目中挽救任何其他内容,并无条件地或自适应地使用它。
  3. 将 Windows 项目的内容移植到面向通用设备系列的应用。 如果适用,请从 WindowsPhone 项目中抢救任何其他内容,并无条件地或自适应地使用它。
  4. 将 Windows 项目的内容移植到面向通用或桌面设备系列的应用,并将 WindowsPhone 项目的内容移植到面向通用或移动设备系列的应用。 可以使用共享项目创建解决方案,并继续在两个项目之间共享源代码、标记文件和其他资产和资源。 或者,可以创建不同的解决方案,并且仍然使用链接共享相同的项。

如果你有 Windows 8.1 应用

将项目移植到面向通用或桌面设备系列的应用。 如果选择通用设备系列,并且应用调用仅在桌面设备系列中实现的 API,则可以使用自适应代码保护这些调用。

如果你有 Windows Phone 8.1 应用

将项目移植到面向通用或移动设备系列的应用。 如果选择通用设备系列,并且应用调用仅在移动设备系列中实现的 API,则可以使用自适应代码保护这些调用。

使你的应用适应多种外形规格

从上一部分选择的选项将确定应用或应用将运行的设备范围,这很可能非常广泛的设备范围。 即使将你的应用限制为移动设备系列,你仍可以使用各种屏幕大小来支持。 因此,如果你的应用将在以前不支持的外形规格上运行,请在这些外形规格上测试你的 UI 并进行任何必要的更改,以便你的 UI 相应地适应每个外形规格。 你可以将其视为移植后任务或移植延伸目标,在 Bookstore2 和 QuizGame 案例研究中,有一些实际示例。

按层实现移植

将通用 8.1 应用移植到 UWP 应用的模型时,几乎所有的知识和经验都将转移,大多数源代码和标记以及你使用的软件模式也会转移。

  • 视图。 视图(以及视图模型)组成了应用的 UI。 理想情况下,视图由绑定到视图模型的可观察属性的标记组成。 其他模式(常见且方便,但仅在短期内使用)适用于代码隐藏文件中的命令式代码,以直接操作 UI 元素。 在任一情况下,UI 标记和设计(甚至是操作 UI 元素的命令性代码)都可以直接移植。
  • 视图模型和数据模型。 即使未正式地体现分离出关注内容模式(例如 MVVM),应用中也必然会存在用于执行视图模型和数据模型的功能的代码。 视图模型代码将使用 UI 框架命名空间中的类型。 视图模型和数据模型代码也使用非可视操作系统和 .NET Framework API(包括用于数据访问的 API)。 这些 API 可用于 UWP 应用,因此,大多数(如果不是所有代码)都会移植,而无需更改。
  • 云服务。 应用的部分内容(或许其大部分内容)可能会以服务形式在云中运行。 在客户端设备上运行的应用的部分内容将连接到这些服务。 在移植分发的应用的客户端部分时,这是该应用中最有可能保持不变的部分。 如果还没有云服务选项,UWP 应用的云服务选项Microsoft Azure 移动服务,它提供了强大的后端组件,你的应用可以调用服务,从简单的通知动态磁贴更新到服务器场可以提供的繁重可伸缩性。

在移植之前或移植过程中,应考虑是否可以通过合并应用来改进它,以便可以将具有类似目的的代码集中在图层中,而不是使它们随意地分散。 将应用分解为上述层可以更轻松地使应用正确、测试应用,然后读取和维护应用。 可以遵循 Model-View-ViewModel (MVVM) 模式使功能更具可重用性。 此模式可使应用的数据、业务和 UI 部分彼此分隔开。 即使是在 UI 中,该模式也可以将状态和行为与视觉效果分隔开并且可分开测试。 借助 MVVM,你可以编写一次数据和业务逻辑并在所有设备上使用它,而不考虑 UI。 你可能还可以跨设备重复使用许多视图模型和视图部分。

主题 说明
移植项目 开始移植过程时,有两个选项。 一种方法是编辑现有项目文件的副本,包括应用包清单(对于该选项,请参阅有关将应用迁移应用中的项目文件更新到 通用 Windows 平台 (UWP)的信息)。 另一个选项是在 Visual Studio 中创建新的 Windows 10/11 项目,并将文件复制到其中。
故障排除 我们强烈建议阅读到此移植指南的末尾,但是我们也理解你希望尽快前进到项目生成和运行的阶段。 阅读到该末尾后,你可以注释或排除非必要的代码,然后稍后返回支付该债务,从而临时加快进度。 本主题中的疑难解答症状和补救办法的表格可能在此阶段对你有用,尽管它无法替代阅读接下来的一些主题。 在你执行到以后的主题时,你可以一直重新参考该表。
移植 XAML 和 UI 以声明性 XAML 标记的形式定义 UI 的做法从通用 8.1 应用非常出色地转换为 UWP 应用。 你会发现大部分标记是兼容的,尽管可能需要对所使用的系统资源键或自定义模板进行一些调整。
针对 I/O、设备和应用模型进行移植 与设备本身及其传感器集成的代码涉及到与用户之间的输入和输出。 它还可以涉及处理数据。 但是通常不将此代码视为 UI 层或数据层。 此代码包含与振动控制器、加速计、陀螺仪、麦克风和扬声器(与语音识别和合成交叉)、(地理)位置和输入形式(例如触摸、鼠标、键盘和笔)的集成。
案例研究:Bookstore1 本主题介绍将非常简单的通用 8.1 应用移植到 Windows 10 和 Windows 11 UWP 应用的案例研究。 通用 8.1 应用是为 Windows 8.1 生成一个应用包,另一个适用于 Windows Phone 8.1 的应用包。 使用 Windows 10 和 Windows 11,可以创建一个应用包,客户可以将其安装到各种设备上,这就是我们将在本案例研究中执行的操作。 请参阅 UWP 应用的指南。
案例研究:Bookstore2 此案例研究基于 SemanticZoom 控件中提供的信息。 在视图模型中,类 Author 的每个实例都表示该作者编写的书籍组,在 SemanticZoom 中,可以查看按作者分组的书籍列表,也可以缩小以查看作者的跳转列表。
案例研究:QuizGame 本主题介绍将正常运行的对等测验游戏 WinRT 8.1 示例应用移植到 Windows 10 和 Windows 11 UWP 应用的案例研究。

文档