8.5 KiB
WinUI 工程实现与验证
目录
- 版本与依赖门槛
- XAML 与状态架构
- 窗口化与响应式实现
- 性能与异步行为
- 实现评审
- 发布测试矩阵
- 严重程度模型
- 官方资料
1. 版本与依赖门槛
生成 XAML 或 C# 前:
- 阅读项目文件、中央软件包属性、目标框架、目标/最低 Windows 版本和已安装软件包。
- 准确确定 Windows App SDK 和 Windows Community Toolkit 版本。
- 检查项目是已打包还是未打包,以及是否使用单项目 MSIX。
- 在当前 Microsoft 文档中验证建议的 API;对于控件,还要在 WinUI 3 Gallery 中验证。
- 在建议中记录最低版本和回退行为。
WinUI 3 使用 Microsoft.UI.Xaml。将使用 Windows.UI.Xaml、WinUI 2 Gallery 或 UWP 特有 API 的示例视为迁移参考,而不是可直接复制的代码。
版本敏感指南示例:
- WinUI
TitleBar控件需要 Windows App SDK 1.7 或更高版本; SystemBackdropElement需要 Windows App SDK 1.6.3 或更高版本;- Mica 需要 Windows 11,在 Windows 10 回退为纯色主题表面;
- Windows Community Toolkit
DataGrid已归档,并非 WCT 8+ 的 WinUI 3 控件。
对于任何第三方控件,记录软件包、版本、许可证、维护状态、支持的 Windows 版本、主题/高对比度行为、UI Automation 支持、键盘模型、本地化、虚拟化和退出方案。
2. XAML 与状态架构
- 遵循项目现有的 MVVM 或代码隐藏约定;不要为一个界面引入第二套架构。
- 当同一操作出现在按钮、菜单、上下文菜单和快捷键中时,将用户操作表示为可复用命令。
- 根据场景明确表示视图状态:空闲、加载、内容、空、筛选后为空、错误、离线/过期、权限被拒绝和部分结果。
- 在资源字典中集中管理语义颜色、文本样式、间距、几何、图标大小和动效。
- 需要在应用运行时变化的值使用
ThemeResource;仅当不需要运行时主题更新时使用StaticResource。 - 需要自定义 Token 时,在主题字典中放置浅色、深色和高对比度映射。
- 优先使用样式和组合,不要复制完整控件模板。自定义模板将承担所有视觉和无障碍状态的实现责任。
- 一致使用
x:Bind或项目既有的绑定方式。为可编辑值明确绑定模式和更新时间。 - 结构化布局使用 Grid 和弹性尺寸;避免深层嵌套面板,以及会破坏本地化或文本缩放的固定尺寸。
- 让视觉顺序与阅读和 Tab 顺序一致。
不要用 UI 线程调度掩盖不合理的异步所有权。只封送真正需要 UI 线程的最终状态更新,并确保视图仍然存在。
3. 窗口化与响应式实现
标题栏
保留系统标题按钮和系统菜单。沿应用画布顶部定义拖动区域,将交互式子元素排除在拖动区域外,并测试活动/非活动外观。验证最大化、还原、调整大小、Snap Layouts、触控、右键系统菜单和高对比度。
项目版本支持时,优先使用平台 TitleBar 控件。与 NavigationView 一起使用时,让一个组件负责后退和窗格切换行为,不要显示重复按钮。
响应式布局
从安全的紧凑布局开始,再添加较宽的视觉状态。使用有效窗口/内容宽度。双向测试每个转换并保留:
- 选择和键盘焦点;
- 滚动位置和展开状态;
- 输入和验证状态;
- 命令可用性;
- 无障碍阅读顺序。
如果重排或重新定位已足够,不要在每次调整大小时替换整个可视化树。对昂贵的大小调整工作进行防抖,不要只因为窗口跨越断点就重建数据集合。
多窗口
定义所有权、激活、持久化位置、最小尺寸、关闭确认和共享数据生命周期。确保命令作用于活动文档/窗口上下文,并让对话框具有正确的 XamlRoot/所有者。
4. 性能与异步行为
- 保持集合虚拟化,并使用真实数据、图像、模板和分组进行测量。
- 在底层自定义
ItemsRepeater前,优先使用ListView、GridView或ItemsView的行为。 - 按接近渲染尺寸解码图像,避免为缩略图加载全分辨率资源,并取消已回收项目的工作。
- 避免在 UI 线程上执行同步文件、网络、数据库或昂贵的序列化工作。
- 让异步命令具备幂等性,或在工作进行时阻止重复调用。
- 支持取消长时间操作;导航、搜索查询变化或窗口关闭后忽略过期结果。
- 立即提供命令反馈。对接近瞬时完成的工作,可轻微延迟大型骨架屏/进度过渡以避免闪烁,但绝不能让 UI 看起来冻结。
- 安全时在刷新期间保留之前可用的内容;区分刷新和首次加载。
- 尽可能为不透明度和变换设置动画;避免对大型可视化树使用引发布局的动画。
- 将昂贵的次要内容延迟到请求时加载,但没有明确方案时,不要延迟加载键盘顺序或核心任务理解所需的控件。
- 测量启动、导航、调整大小、输入延迟、滚动流畅度、内存增长,以及设备/主题变化后的恢复。
5. 实现评审
先检查正确性,再评审视觉润色:
- 命名空间、API、软件包版本和最低操作系统有效。
- 项目能够构建,且未在修改范围内引入警告。
- 命令不会重复提交,失败时保留用户工作。
- 每个数据界面根据需要具有加载、空、错误和重试行为。
- 虚拟化、回收和取消能处理生产规模数据。
- 主题资源在运行时更新,自定义 Token 覆盖高对比度。
- 布局能够承受紧凑宽度、长字符串、文本缩放和显示缩放。
- 焦点、选择、无障碍名称、角色、状态和播报正确。
- 标题按钮、拖动区域、对话框和多窗口所有权行为正确。
- 破坏性操作使用与后果成比例的撤销或确认。
6. 发布测试矩阵
测试代表性组合,而不是只测试一台理想机器:
| 维度 | 最低覆盖范围 |
|---|---|
| Windows | 最低支持的操作系统和当前 Windows 11 |
| 窗口 | 支持的最小尺寸、小 <=640 epx、中 641–1007、大 >=1008、贴靠、最大化 |
| 缩放 | 常见的 100%、125%、150%、200% 显示缩放和显示器切换 |
| 文本 | 默认和增大的 Windows 文本大小 |
| 主题 | 浅色、深色、高对比度;透明效果开启和关闭 |
| 输入 | 仅键盘、鼠标,以及产品声明支持时的触控/笔 |
| 辅助技术 | Narrator、放大镜、Accessibility Insights/Inspect |
| 内容 | 空、单项、真实数据、超大数据、长本地化字符串、失败 |
| 环境 | 慢速存储/网络、离线、权限被拒绝、相关时的 RDP 或材质回退 |
| 生命周期 | 适用时的挂起/关闭、重新打开、升级、辅助窗口关闭、崩溃安全的数据恢复 |
自动执行稳定检查,但为 Narrator 流程、焦点可见性、触控舒适度、动效、文案、层级和感知响应速度保留人工评审。
7. 严重程度模型
评审设计或实现时使用以下顺序:
| 严重程度 | 定义 | 示例 |
|---|---|---|
| 阻断 | 阻止主要任务、排除某种输入/无障碍方式、丢失数据或使用不可用 API | 键盘陷阱、保存按钮被裁切、假设已归档控件仍存在 |
| 严重 | 导致频繁错误、迷失方向、内容不可访问,或严重的响应式/性能问题 | 焦点返回错误、大型列表未虚拟化、深色模式不可读 |
| 中等 | 降低任务效率,或产生虽有替代方案但不一致的 Windows 行为 | 隐藏上下文命令、空状态薄弱、选择行为不一致 |
| 轻微 | 对任务影响很小的润色问题 | 间距偏差、图标字重不一致、不必要的阴影 |
每项发现都要指出界面/控件、触发条件、用户影响和最小稳健修正方案。避免“让它更现代”等模糊反馈。