Windows 应用程序开发 - 最佳做法
本文档中的最佳做法将帮助你构建出色的 Windows 应用,这些应用可覆盖并满足全球约 15 亿位不同电脑用户。 本文档分为以下部分:
- 用户体验:本部分中的指南有助于改进应用的外观、感受和可用性。
- 性能和基础知识:本部分中的指南有助于提升应用的性能和资源利用率。
- 操作系统/硬件优化:本部分中的指南有助于针对各种硬件配置优化打包和分发。
- 应用程序发现和管理:本部分中的指南可让用户更轻松地发现、安装、更新和卸载应用。
- 辅助功能:本部分中的指南有助于构建辅助性和包容性体验。
- 安全和隐私:本部分中的指南有助于缓解安全风险并满足用户的隐私需求。
用户体验 (UX)
Windows 11 标志着 Windows 操作系统的视觉发展,改进了 Windows 的外观、感受和可用性。 我们的研究表明,用户对 Windows 应用的期望很高:
- 期望 Windows 应用适用于完整输入范围。
- 期望设计和交互模式在当前和未来设备上的外观和感受都是原生的。
- 期望支持新式窗口化工作流和 shell 集成点。
当应用程序遵循 Windows 样式和标准 Windows 行为时,用户无需重新学习交互模式。 这使用户更容易使用你的应用。 外观出色的应用可带给人出色的第一印象,但同时还易于使用并有助于用户实现其目标的应用,将产生出色的持久印象。
Windows 11 以 Windows 11 设计原则为基础构建。 在构建应用时遵循这些准则有助于满足客户对出色应用体验的期望。 在考虑将最新和推荐的 Windows 应用程序 UI/UX 模式整合到你的 Windows 应用程序中时,建议关注以下 5 个领域:
- Layout
- UI 交互
- 视觉样式
- 窗口行为
- Shell 集成点
WinUI 3 通过其通用控件为其中许多体验和样式提供内置支持。 如果不能使用 WinUI 3,请考虑模拟设计工具包和 WinUI 库中展示的样式。
Layout
Windows 应用程序在满足用户需求的各种配置上运行。 在各种维度、设备、窗口大小、DPI 设置和缩放设置中测试应用程序的窗格和/或页面。 应用程序即使缩小为小维度,也应按预期方式运行。
DPI 感知
WinUI 应用程序会自动缩放其运行的每个显示。 其他 Windows 编程技术(Win32、WinForms、WPF 等)不会自动处理按显示器 DPI 缩放。 如果不进行额外的工作来支持这些技术的按显示器 DPI 缩放,应用程序可能会显得模糊或大小错误。 有关详细信息,请参阅 Windows 上的高 DPI 桌面应用程序开发。
响应式布局
使用响应式设计技术,以针对不同窗口大小优化应用页面。 请遵循平移或滚动指南,确保无论应用窗口变得多么小,用户都始终可以访问内容。
UI 交互
Windows 用户可以从多种输入设备中进行选择,以便与你的应用程序进行交互,并且 Windows 具有人们习惯使用的特定系统体验。 如果你的应用程序遵循这些体验,你的用户便能可靠地使用应用程序。 如果你的应用不遵循这些惯例,用户可能会感到困惑或沮丧。
对象上命令
使用对象上命令,例如上下文菜单、轻扫命令和键盘快捷方式。 Windows 11 改进了右键单击上下文菜单的行为,因此如果应用创建上下文菜单,请参阅最新的上下文菜单集成指南。 WinUI 文本控件自动公开“剪切/复制/粘贴”命令,但其他控件可能需要额外的工作才能支持这些命令。
文本交互
只要应用程序中有文本,用户便会希望能够选择和复制它。 如果文本是可编辑的,则用户也会希望自己能够进行剪切和粘贴。 通过向用户提供一致的快捷方式,可以让他们更高效地完成其任务。 请确保可以使用键盘、鼠标或触控板、触摸和触控笔执行这些操作。
平移和滚动
应用程序的 UI 不需要滚动就能完全容纳在单个页面中,这是很少见的。 即使只有少数几个 UI 元素,用户也可以自由调整应用窗口的大小并导致一些 UI 元素被隐藏。 请确保应用程序的 UI 正确支持滚动和平移(使用键盘、鼠标或触控板、触摸和笔),以便用户能够访问可能已移出可见窗口区域的任何 UI 元素。
视觉样式
Windows 11 基于 Windows 11 设计原则构建:轻松、冷静、个性、熟悉和完整 + 连贯。 我们相信遵循这些原则的体验会在 Windows 上带来出色的用户体验。
材料:亚克力和云母
亚克力和云母是视觉材料,可为交互式 UI 控件提供独特的“封闭”视觉样式。 使用亚克力将半透明样式应用到瞬态图面,例如上下文菜单、浮出控件和其他可轻型消除的元素。 使用云母将细微的自适应色调添加到长期性 UI 图面,例如标题栏。
有关亚克力和云母材料的详细信息,请参阅在 Windows 11 上为增强应用功能而可以采取的措施。
深色和浅色主题
深色和浅色主题为用户提供了让应用适应其视觉首选项的方法。 Windows 11 更新了色调,避免使用纯白和纯黑两种颜色,从而提供更柔和的视觉体验,让颜色看起来更令人愉悦。 WinUI 默认支持在深色和浅色主题之间切换(请参阅 XAML 主题资源)。 对于 Win32 应用,请参阅在 Win32 应用中支持深色和浅色主题。 (Win32 应用中的标题栏不会自动适应深色主题。请务必遵循文章中的标题栏指南)。
刷新的 UI 元素
Windows 11 几何图形经过精心设计,可支持新式应用体验。 渐进式圆角、嵌套元素和一致的线槽组合在一起,产生了一种舒适、稳定和易使用的效果,强调了目的和易用性的统一。
WinUI 3 中内置了视觉对象和行为更改。 使用 WinUI 3,你可以利用已完成的工作。 如果不能使用 WinUI 3,请考虑模拟设计工具包和 WinUI 库中展示的样式。
上下文菜单
上下文菜单是一种快捷菜单,用户通过右键单击或点击并按住操作来调用该快捷菜单,以显示与用户正在与之交互的控件的上下文相关的命令菜单。 用户希望上下文菜单的外观和行为在 Windows 中保持一致。 请尽可能使用平台提供的上下文菜单,以使它们与系统的其余部分保持一致。
图标和版式
Windows 11 更新了图标(“Segoe Fluent 图标”),改进了对动画图标的支持,并具有新的 UI 字体(“Segoe UI 变量”)。 建议尽可能使用这些新图标和字体,以便在 Windows 11 上保持一致。 新字体使用更柔和的几何图形,使文本更加清晰。
有关 Windows 上图标和版式的详细信息,请参阅在 Windows 11 上为增强应用功能而可以采取的措施。
窗口行为和样式
应用程序在 Windows 提供的框架中运行,用户希望内置的 Windows 外观和行为在应用窗口之间保持一致。 请考虑支持此处列出的功能,以确保应用在 Windows 11 上的外观和功能符合用户的期望。
贴靠布局
窗口贴靠在 Windows 11 中得到了极大的增强,“贴靠布局”菜单是一项新功能,可帮助用户发现和使用窗口贴靠的强大功能。 使用贴靠布局菜单在不同的贴靠布局中测试应用,确保应用支持不同的贴靠尺寸(如 1/2、1/3 和 1/4 屏幕)。
如果默认情况下应用没有显示贴靠布局菜单,请参阅支持为 Windows 11 上的桌面应用使用贴靠布局,了解要启用它可采取的一些步骤。
标题栏和字幕按钮
标题栏和字幕按钮(最小化、最大化、关闭)是用户与 Windows 交互以重设大小、移动和关闭应用窗口的方式。 拥有一致的体验将有助于用户顺畅地使用你的应用程序。 请参阅 Windows 应用程序标题栏,了解适用于 Windows 的标题栏和字幕按钮设计。
可使用 Windows 应用 SDK API 在 WinUI 3、.NET、WinForms 和 WPF 应用中将应用内容与标题栏集成。
圆角
在大多数情况下,在 Windows 11 上,应用的窗口默认为圆角。 如果已自定义应用窗口并且没有圆角,请参阅在 Windows 11 的桌面应用中应用圆角,了解可执行的一些操作。 此外,还应避免自定义窗口边框和阴影,这会阻止系统将窗口显示为圆角。
Shell 集成点
Windows shell 集成允许用户从应用中受益,即使应用未在前台运行,甚至在屏幕上可见也是如此。 当应用与 Windows 顺利集成时,它会成为用户与其他应用的工作流的一部分,并有助于创建无缝体验。
Toast 通知
Toast 通知是显示在用户屏幕底部和通知中心的 Windows 通知。
- 对用户而言,通知应个性化、可操作且有用。 尝试向用户提供他们想要的内容,而不是你希望他们知道的内容。
- 通知不应造成干扰。 应用中断过多会导致用户关闭应用的这一关键通信渠道。
- 响应用户的意向。 选择通知应在通知的上下文中启动应用。 此指南的唯一例外是用户在通知上选择附加到后台任务(如快速回复)的按钮这一情况。
- 提供一致的通知中心体验。 通过清除旧通知保持通知中心整洁。
有关 Toast 通知的详细信息,请参阅通知设计基础知识。
性能和基础
Windows 用户希望 Windows 应用表现出出色的性能和基础。 在设计和构建应用时,请谨记要优化内存使用量、能耗、响应能力、可靠性以及对长期可持续性的影响。 分配时间来测试和测量应用程序的基础和性能将确保用户拥有一流体验。
按照此部分中的最佳做法操作,有助于满足客户对这些条件的期望。
-
- 减少前台内存使用量。
- 使后台工作最小化。
- 在后台释放资源。
- 确保应用程序不会泄漏内存。
-
- 为可选功能启用“付费播放”。
- 确保所有缓存都高效调整大小。
- 以节省磁盘的方式实现新体验。
- 尽可能优化单个二进制大小。
-
- 不要在后台唤醒 CPU 或使用系统资源。
-
- 定义主要交互场景,并添加 ETW 事件以进行衡量。
- 根据与用户期望关联的交互类设置目标。
若要了解详细信息,请参阅性能和基础知识概述,其中将介绍“什么是应用程序性能,这为什么很重要?”或“我可以使用哪些工具来衡量 Windows 应用程序性能?”,以及链接到案例研究、相关博客、支持社区以及性能工程如何与可持续性(减少应用程序对地球的影响)互相交叉的问题。
操作系统/硬件优化
Windows 应用可以通过多种方式构建、打包和交付。 本部分中的最佳做法将有助于跨硬件配置优化应用程序的这些方面。
MSIX 应用附加和 Azure 虚拟桌面
如果希望应用在企业环境中运行最佳,请添加对 MSIX 应用附加的支持。
MSIX 应用附加可让你将 MSIX 应用程序交付到物理计算机和虚拟机。 它专为 Azure 虚拟桌面 (AVD) 而设计,后者是一种在云上运行的桌面和应用虚拟化服务。 将 MSIX 应用附加与 AVD 配合使用有助于改进用户的登录时间,并能够降低企业的基础结构成本。
基于 ARM 的 Windows
Windows 可以在 ARM 设备上运行。 ARM 电脑受益于延长的电池生命以及对移动数据网络的集成支持。 这些电脑还提供出色的应用程序兼容性,让你在不进行任何修改的情况下运行现有的 x86
和 x64
应用程序。
为获得最佳性能,应通过构建完整的 ARM 版本或优化代码库中最能从原生性能中受益的部分,使应用能够充分利用节能的 ARM 处理器体系结构。 有关这些技术的详细信息,请参阅基于 ARM 的 Windows 和适用于基于 ARM 的 Windows 11 应用的 Arm64EC。
推送通知
推送通知使你能够以性能优化的方式将云服务中的信息发送到应用。 推送通知包括原始通知、锁屏提醒通知以及从云服务发送的 Toast 通知。
- 使用推送通知唤醒应用/客户端,而不是始终使其保持运行状态,以优化用户设备上的性能。
- 通知渠道不应用于发送广告。
- 尊重
retry-after
标头 - 这可以保护我们的服务并确保通知传递成功。 - 从系统中移除已过期/撤销的渠道。 Windows 通知服务 (WNS) 不会处理已过期/撤销渠道的请求。
- 避免突然对 WNS 进行大量请求。 这可能会导致响应受限制。
- 利用
MS-CV
标头。 这将有助于实现端到端可追溯性和诊断。 - 准备一种备用机制,用于通知不起作用的情况。
- 使用 Azure 通知中心 (ANH)。 凭借 ANH,你可以访问参与功能,如确定受众目标、安排通知和广播通知。 如果你当下是仅使用 Windows 的开发人员,使用 ANH 将使你将来能够轻松将通知基础结构转移到其他平台。
应用程序发现和管理
可靠的安装、更新和卸载体验是高质量一致用户体验的重要部分。 以下最佳做法有助于确保应用程序在用户发现和管理它们时留下良好印象:
应用程序发现
- 在 Microsoft Store 上列出你的应用可以使应用更易于发现。
- 如果跨多个渠道托管应用(例如,在网站和 Microsoft Store 上),则应用程序应具有在所有渠道之间保持一致的应用程序标识和更新机制。
- 通过 Microsoft Store 分发应用,让用户更容易发现应用。 请注意,用户可以通过 Windows 程序包管理器 WinGet 使用 Store 应用。 如果不发布到 Microsoft Store,仍然可以通过 WinGet 存储库使应用在 WinGet 中很容易发现。
安装和卸载
- 支持每用户安装。 这将使用户能够更轻松地安装并避免 UAC 提示。
- 确保应用程序安装无错误、透明且对文件管理考虑周密。 应用程序安装不应保留任何临时文件。
- 在可行时避免要求提升的权限来安装和要求操作系统重启。
- 支持无提示安装。 这对企业环境中的应用可管理性非常重要。
- 确保应用列在“应用 -> 已安装的应用”列表中。
- 请考虑使用 MSIX 来确保用户享有无缝安装、更新和卸载体验。 MSIX 会自动删除应用二进制文件和数据。 有关打包应用如何处理文件和注册表项的信息,请参阅了解打包的桌面应用如何在 Windows 上运行。
- 对于未打包的应用,请确保应用程序可通过设置中的“应用 -> 已安装的应用”列表轻松卸载。 卸载应用程序后,请确保“开始”菜单项、文件、目录、注册表项和临时文件也都删除。 请考虑让用户在卸载应用程序时可选择保留其数据。
- 确保应用在卸载期间会删除所有二进制文件和应用程序数据。 用户创建的内容应存储在
Documents
等位置,即使在应用卸载后用户也可以保留这些内容。 - 避免安装或更新可能需要重启的系统二进制文件。
- 与 RestartManager 集成,以在 OS 更新之间保存和还原状态。
更新
- 支持一种更新机制,允许应用在用户方便时重启。 考虑使用 Windows 应用 SDK 重启 API 来管理 WinUI 3 应用的应用行为。
- 确保更新机制仅下载需要更新的基本更改组件。 这可以最大限度地减少所需的网络带宽。
- 确保提供更新和修复应用的方法。 考虑 MSIX,它会自动处理更新修复。 有关详细信息,请参阅自动更新和修复应用。
- 考虑基于推送通知的更新或在应用启动或重启时检查可用更新。
其他资源
可访问性
具有辅助性的 Windows 应用支持为尽可能多的人提供丰富且具有包容性的体验,包括残障人士(临时和永久)、个人偏好、特定工作风格或情况约束(如共享工作空间、驾驶、烹饪和防眩等)。
事实上,世界卫生组织并未将残疾定义为个人特征,而是将其定义为个人与其周围物理和数字世界之间不匹配的互动。
辅助功能对人员和业务均有利
辅助功能是一项责任
全世界有超过 10 亿人具有某种形式的残疾。 然而,只有 1/10 的人可获得充分参与经济和社会所需的辅助技术。 通常,残疾人的失业率是非残疾人的两倍。 无论是情境性、暂时性残疾,还是永久性残疾,残疾都可能随时影响任何人。
辅助功能是一个机会
根据 Microsoft 辅助功能方法数据表:采用在工作场所雇用和支持残疾人的最佳做法的包容性组织表现优于同行,并能更好地吸引和留住优秀人才。 到 2020 年,千禧年一代将占全球劳动力的 75%,他们通常会选择能体现其价值观的雇主。 多样性和包容性位居榜首。
纳入辅助功能
将辅助功能纳入 Windows 应用可实现用户参与最大化,提高产品满意度,并提升产品忠诚度。 主动设计和实现辅助性体验通常可在长期过程中减少开发和维护成本。
有关构建辅助性 Windows 应用的详细指南,请参阅 Windows 11 和 Windows 10 中的辅助功能。
辅助功能测试
辅助功能见解是一套功能强大的工具,供开发人员测试其应用和服务的辅助功能。 下面是一些用于测试辅助功能的工具:
- 在适用于 Windows 的辅助功能见解中检查。 检查辅助功能树以查找容易实现的目标,例如标签中的提示、不正确的角色等。
- 适用于 Windows 的辅助功能见解中的事件监视 · 辅助功能见解。 有关事件监视的详细信息,请参阅支持 UI 自动化控件类型。
- 在 PR 或 CI/CD 中运行辅助功能见解自动检查。 有关详细信息,请参阅 axe-pipelines-samples。
- 修复你发现的所有 bug,它们都对辅助功能产生直接影响。
安全和隐私
不安全的应用程序可能是允许攻击者执行恶意活动的入口点。 即使应用没有安全 bug,攻击者也可以使用应用通过钓鱼和其他违反安全和隐私边界的社会工程形式发起攻击。 本部分中的最佳做法有助于缓解与安全和用户隐私相关的风险。
安全指导原则
- 遵循安全开发生命周期进行所有开发。
- 威胁建模有助于避免安全缺陷。
- 使用安全库、语言和工具可最大程度减少实现缺陷。
- 安全默认值可防止用户错误导致的安全问题。
- 无需管理权限即可安装应用。
- 理想情况下,应用应同时支持管理安装和每用户安装。
- 使用 MSIX 打包是实现此目的的一种方法。
- 无需管理权限即可运行应用。
- 如果某些功能需要管理权限,请考虑将其分成各自的进程,以减少攻击面。
- 首选使用具有保证内存安全的语言(例如 C#、JavaScript 或 Rust),尤其是对于有风险的代码路径(例如分析不受信任的数据)。
- 使用编译器和工具集提供的所有安全缓解措施(请参阅 Microsoft Visual C++ 中的安全功能,了解 Visual C++)。
- 始终将所选语言或框架的标准库用于加密和其他安全敏感型代码。 不要尝试自行构建。
- 对应用程序所有组件进行数字签名 – 不仅是安装程序,还有卸载程序(如有)。 此外,请对构成应用的所有 EXE、DLL 和其他可执行文件签名。
- 数字签名使用户能够验证应用的真实性,并支持企业管理员使用 Windows Defender 应用程序控制来保护其设备。
- 使用 MSIX 打包是实现此目的的一种方法。
- 确保所有网络通信都通过安全传输,如 SSL。
- 提供防护措施或其他缓解措施,帮助防止用户意外执行有害操作,即使对攻击者强制这样做的情况也适用。
- 简单的“是否确实要执行 X? 是/否”对话框通常无效,因为用户习惯性单击“是”。
大多数新式应用都会出于各种原因收集和使用大量数据(包括个人数据)。 遥测、产品改进和盈利是使用数据的三种常见原因,但用户和监管机构对这些做法的隐私影响越来越敏感。 他们希望应用收集和使用的数据能保持透明和受掌控。 使用以下提示来帮助满足用户隐私需求。
隐私准则
- 确保应用提供准确的隐私策略。 理想情况下,除了提供长篇法律策略(面向律师编写)之外,还提供为普通受众(用户)编写的摘要文档。
- 熟悉应用所在市场的隐私法规,并确保应用满足或高出披露、使用权、删除请求等方面的任何要求。
- 确保收集完成应用体验所需的最少个人数据量。
- 不要“以防万一”才收集数据 - 收集所有数据应具有正当理由,例如为改进客户体验或促进盈利。
- 在收集和存储个人数据之前,始终获取用户的同意,并为用户提供一种在将来还原其决定的简单方法。 避免使用“深色模式”,例如让“同意”对话框中的“是”按钮比“否”按钮更大或更突出。
- 查阅适用法规,确定特定类型的数据需要哪些具体的披露和同意。 例如,某些地区可能允许用户查看、更改或删除你存储的有关他们的数据。
- 如果必须通过网络传输数据,请始终使用安全连接,例如通过 TLS。
- 避免将个人数据存储在集中的位置(例如网站)。 如果必须存储个人数据,请尽量减少存储的数据量,仅在必要时存储数据,并确保其安全加密。
- 验证所使用的任何第三方库或 SDK 是否也具有良好的隐私做法。 请注意,这不仅限于广告 SDK,连接到 Internet 的任何库都可能会影响应用用户的隐私。