213 lines
11 KiB
Markdown
213 lines
11 KiB
Markdown
# 桌面对话框、反馈与长任务交互规范
|
|||
|
|
|
||
|
|
## 目录
|
||
|
|
|
||
|
|
1. 选择反馈层级
|
||
|
|
2. 对话框交互契约
|
||
|
|
3. 焦点、按钮与关闭
|
||
|
|
4. 确认、删除与未保存决策
|
||
|
|
5. 进度、取消与后台任务
|
||
|
|
6. 错误、重试与部分成功
|
||
|
|
7. 通知、信息条与临时反馈
|
||
|
|
8. 异步与生命周期
|
||
|
|
9. 测试矩阵
|
||
|
|
10. 交付检查清单
|
||
|
|
|
||
|
|
## 1. 选择反馈层级
|
||
|
|
|
||
|
|
使用能解决问题的最低干扰层级:
|
||
|
|
|
||
|
|
| 场景 | 优先形式 | 不应使用 |
|
||
|
|
|---|---|---|
|
||
|
|
| 字段格式或局部操作错误 | 字段附近/组件内联反馈 | 应用级模态错误框 |
|
||
|
|
| 页面加载失败、离线、权限或可恢复警告 | 页面内信息条/Banner,带操作 | 自动消失 Toast |
|
||
|
|
| 简短、可忽略、无需立即操作的完成状态 | 非模态临时通知或状态区 | 阻塞对话框 |
|
||
|
|
| 与当前对象相关的附加选择/详情 | Flyout/Popover/非模态面板 | 无原因的全窗口模态 |
|
||
|
|
| 应用无法安全替用户决定 | 窗口级模态对话框 | 隐藏在状态栏的提示 |
|
||
|
|
| 永久破坏贵重资产、安全/支付等高风险决策 | 明确后果的确认对话框 | 含糊“确定/取消” |
|
||
|
|
| 长时间但可继续其他工作的任务 | 页面/任务中心进度,可后台化 | 锁住整个应用的旋转圈 |
|
||
|
|
| 短暂阻塞且必须完成才能继续 | 局部遮罩或模态进度,支持取消时提供取消 | 假装确定进度的百分比 |
|
||
|
|
|
||
|
|
同类、重复或持续状态应占据稳定界面位置,不要每次弹出。对常见可恢复操作优先直接完成并提供撤销,而不是反复确认。
|
||
|
|
|
||
|
|
## 2. 对话框交互契约
|
||
|
|
|
||
|
|
创建对话框前定义:
|
||
|
|
|
||
|
|
- 为什么必须阻塞,以及阻塞当前窗口还是整个应用;
|
||
|
|
- 标题、简短说明、影响对象和所需决策;
|
||
|
|
- 主操作、次操作、取消/关闭、默认按钮与危险按钮;
|
||
|
|
- 初始焦点、Tab 循环、Enter、Escape 和窗口关闭按钮行为;
|
||
|
|
- 验证、提交中、失败、重试和成功后的关闭条件;
|
||
|
|
- 所有者窗口、重复打开防护和对话框生命周期;
|
||
|
|
- 屏幕阅读器名称、描述和状态播报。
|
||
|
|
|
||
|
|
### 内容与动作
|
||
|
|
|
||
|
|
- 标题直接说明决策,如“删除 3 个项目?”或“保存更改后关闭?”。
|
||
|
|
- 正文说明不可见后果和影响范围,不重复标题或堆叠技术错误。
|
||
|
|
- 按钮使用具体动词:“删除”“覆盖”“保存并关闭”,不要让危险操作叫“确定”。
|
||
|
|
- 常用安全操作是视觉主按钮;不可恢复操作与其他按钮分离,并使用一致的危险样式。
|
||
|
|
- 超过三项复杂选择通常应改成任务页面或向导,不把应用页面塞进对话框。
|
||
|
|
- 对话框内只有完成决策所需内容;帮助和详细日志使用可展开区或外部入口。
|
||
|
|
|
||
|
|
## 3. 焦点、按钮与关闭
|
||
|
|
|
||
|
|
### 打开
|
||
|
|
|
||
|
|
- 将焦点移入对话框。短对话框聚焦最安全且最可能的操作;复杂内容先聚焦标题/说明或第一个字段。
|
||
|
|
- 不可逆决策默认聚焦取消或最安全操作,除非平台和业务有充分理由。
|
||
|
|
- 记录调用者;关闭后将焦点返回调用者,调用者消失时返回逻辑后继。
|
||
|
|
- 模态界面必须让背景在视觉和交互上都不可用;不能只添加 `aria-modal` 或半透明遮罩。
|
||
|
|
|
||
|
|
### 操作
|
||
|
|
|
||
|
|
- Tab/Shift+Tab 留在模态对话框内部;非模态面板允许按明确规则离开。
|
||
|
|
- Enter 只触发当前有效的默认按钮;多行输入中默认换行。
|
||
|
|
- Escape 执行取消/关闭,不提交或丢失输入;无法取消时解释原因并提供可见关闭路径。
|
||
|
|
- 右上角关闭、Alt+F4、Escape 和取消按钮使用同一取消协议。
|
||
|
|
- 提交中防重复操作;若可取消,取消请求与关闭 UI 是两个阶段,等待任务确认停止或忽略结果。
|
||
|
|
|
||
|
|
### 关闭
|
||
|
|
|
||
|
|
- 成功、取消、失败和窗口关闭返回可区分结果,调用方不能把所有关闭都当成功。
|
||
|
|
- 验证失败或提交失败时保持对话框打开并保留输入。
|
||
|
|
- 对话框关闭时清理订阅、计时器和任务回调,防止访问已销毁界面。
|
||
|
|
- 避免同时打开多个相同对话框;重复请求应激活已有实例或排队。
|
||
|
|
|
||
|
|
## 4. 确认、删除与未保存决策
|
||
|
|
|
||
|
|
### 何时确认
|
||
|
|
|
||
|
|
仅当操作不可逆、代价高、影响范围难以预见、涉及安全/支付,或应用无法安全提供撤销时确认。频繁删除草稿、移除可恢复项等优先立即执行并提供撤销。
|
||
|
|
|
||
|
|
确认内容必须包含:动作、对象、数量、不可逆后果和必要条件。不要使用双重否定或“是否确定?”作为全部说明。
|
||
|
|
|
||
|
|
### 未保存内容
|
||
|
|
|
||
|
|
- 使用“保存 / 不保存 / 取消”而不是模糊的“是 / 否”。
|
||
|
|
- 多文档退出列出受影响文档,并支持安全的“全部保存”与失败项处理。
|
||
|
|
- 保存失败保持窗口/标签打开,提供重试、另存或恢复内容出口。
|
||
|
|
- 不保存仅放弃明确列出的本地更改,不删除远程数据或其他自动保存版本。
|
||
|
|
- 关闭、后退、切换账户和应用退出共享同一未保存协调器。
|
||
|
|
|
||
|
|
### 覆盖与冲突
|
||
|
|
|
||
|
|
- 文件或数据已变化时显示来源、时间和可理解差异,提供保留本地、重新加载、另存/复制或合并。
|
||
|
|
- 默认操作选择数据损失最小的方案。
|
||
|
|
- 不把版本冲突伪装成普通“保存失败”,也不要静默覆盖。
|
||
|
|
|
||
|
|
## 5. 进度、取消与后台任务
|
||
|
|
|
||
|
|
### 任务状态模型
|
||
|
|
|
||
|
|
至少定义 `queued`、`running`、`pausing/paused`(适用时)、`cancelling`、`cancelled`、`succeeded`、`failed` 和 `partially-succeeded`。完成、失败与取消是终态,不能仅靠进度条是否消失判断。
|
||
|
|
|
||
|
|
### 进度选择
|
||
|
|
|
||
|
|
- 已知总量且进度可信时使用确定进度,显示完成量/总量或百分比及当前阶段。
|
||
|
|
- 总量未知时使用不确定进度,并用具体文本说明正在做什么。
|
||
|
|
- 先不确定、后可计算时允许切换为确定进度,但进度不能倒退或长期停在 99%。
|
||
|
|
- 极短操作避免闪烁;稍长操作先显示局部忙碌状态,达到明显时长后升级为进度界面。
|
||
|
|
- 后台任务显示在稳定任务中心/状态区,可重新找到;通知只作为补充。
|
||
|
|
- 多文件/多阶段任务同时显示总体进度和当前项,不用每行一个永久旋转圈。
|
||
|
|
|
||
|
|
### 取消
|
||
|
|
|
||
|
|
- 只有任务真实支持安全取消时显示取消按钮。
|
||
|
|
- 点击后进入 `cancelling`,禁用重复取消,并说明正在停止;不能立即谎称已取消。
|
||
|
|
- 定义取消点、已完成工作的保留/回滚、临时文件清理和后端请求撤销。
|
||
|
|
- 窗口关闭时明确任务取消、后台继续或转移到任务中心,不能让工作静默中断。
|
||
|
|
- 取消后的迟到结果必须被请求 ID/任务状态拒绝,不能重新把 UI 改成成功。
|
||
|
|
|
||
|
|
### 响应速度
|
||
|
|
|
||
|
|
- 所有 I/O、计算和批处理离开 GUI 线程;通过线程安全消息更新进度。
|
||
|
|
- 节流高频进度更新,避免每个字节/记录都刷新 UI。
|
||
|
|
- 不使用 `processEvents()` 或嵌套事件循环掩盖阻塞。
|
||
|
|
- 任务命令具有幂等/去重策略,双击按钮不能创建重复任务。
|
||
|
|
|
||
|
|
## 6. 错误、重试与部分成功
|
||
|
|
|
||
|
|
错误反馈回答:发生了什么、影响什么、用户能做什么、工作是否保留。
|
||
|
|
|
||
|
|
### 错误分类
|
||
|
|
|
||
|
|
- **用户可修复:** 指向字段、权限申请、文件位置或设置。
|
||
|
|
- **暂时故障:** 提供重试、稍后处理、离线或切换服务。
|
||
|
|
- **冲突:** 提供刷新、比较、合并、另存或放弃本地更改。
|
||
|
|
- **不可恢复:** 保留诊断 ID/日志出口和安全返回路径,不暴露内部堆栈。
|
||
|
|
|
||
|
|
### 重试
|
||
|
|
|
||
|
|
- 重试只重复失败且安全的部分,保留已完成结果。
|
||
|
|
- 不可幂等操作重试前查询实际状态或使用幂等键,避免重复付款、创建或删除。
|
||
|
|
- 连续失败不无限弹窗;提供持久错误区和诊断入口。
|
||
|
|
- 网络恢复自动重试时显示状态并限制退避;用户手动重试仍可用。
|
||
|
|
|
||
|
|
### 部分成功
|
||
|
|
|
||
|
|
- 显示成功、失败、跳过、取消的数量和对象范围。
|
||
|
|
- 允许查看/导出失败详情、重试失败项或撤销成功项(可行时)。
|
||
|
|
- 不用绿色“成功”覆盖失败项,也不因少量失败否认全部已完成工作。
|
||
|
|
- 批量操作结束后刷新受影响数据,同时保持仍有效的选择和上下文。
|
||
|
|
|
||
|
|
## 7. 通知、信息条与临时反馈
|
||
|
|
|
||
|
|
### 信息条/Banner
|
||
|
|
|
||
|
|
- 用于页面级可恢复问题、离线、权限、过期数据和需要操作的警告。
|
||
|
|
- 保持到问题解决、用户关闭或上下文消失;关闭后是否再次出现由状态而非计时器决定。
|
||
|
|
- 包含严重程度、简短文本、主要恢复动作和必要时的详情。
|
||
|
|
- 出现时不抢焦点,但重要状态通过无障碍实时区域/平台事件播报。
|
||
|
|
|
||
|
|
### 临时通知/Toast
|
||
|
|
|
||
|
|
- 仅用于无需立即响应且不会因错过而阻塞任务的信息。
|
||
|
|
- 不承载唯一的撤销入口、关键错误或复杂决策;重要历史可在任务/通知中心找到。
|
||
|
|
- 避免连续堆叠相同通知,合并重复事件并限制频率。
|
||
|
|
- 自动消失前给足阅读时间;键盘和屏幕阅读器用户能访问需要的操作。
|
||
|
|
|
||
|
|
### 成功反馈
|
||
|
|
|
||
|
|
- 页面内变化明显时无需额外“成功”弹窗。
|
||
|
|
- 保存、复制、导出等结果不明显时提供简短状态,并包含位置或下一步。
|
||
|
|
- 撤销反馈说明对象与时限;时限结束后命令状态一致,不留下失效按钮。
|
||
|
|
|
||
|
|
## 8. 异步与生命周期
|
||
|
|
|
||
|
|
- 每个对话框/任务有唯一实例或任务 ID、所有者和取消源。
|
||
|
|
- 异步完成前核对窗口、页面和对象仍存在,且结果仍属于当前请求。
|
||
|
|
- 关闭 UI 不等于工作已停止;分开管理可见状态和任务状态。
|
||
|
|
- 应用挂起、退出、网络断开、凭据过期和权限变化时定义持久化/恢复。
|
||
|
|
- 错误处理不能在后台线程直接操作 GUI;通过队列信号/调度器返回 UI 线程。
|
||
|
|
- 记录必要诊断信息但过滤密码、令牌、个人数据和完整文件内容。
|
||
|
|
- 任务完成通知不抢夺用户当前窗口或焦点;需要时提供“打开结果”。
|
||
|
|
|
||
|
|
## 9. 测试矩阵
|
||
|
|
|
||
|
|
至少验证:
|
||
|
|
|
||
|
|
1. 内联、页面级、临时通知、Flyout 和模态层级选择是否正确;
|
||
|
|
2. Enter、Escape、Alt+F4、关闭按钮、Tab 循环和焦点返回;
|
||
|
|
3. 危险操作、可撤销删除、未保存和版本冲突;
|
||
|
|
4. 确定/不确定进度、快速完成、长时间停顿和多阶段任务;
|
||
|
|
5. 取消请求、取消中关闭、迟到成功、重复提交和应用退出;
|
||
|
|
6. 网络失败、权限、超时、部分成功、重试失败和离线恢复;
|
||
|
|
7. 多窗口所有者、父窗口关闭和重复打开同一对话框;
|
||
|
|
8. 100%–200% 缩放、长文案、高对比度、减少动画、键盘和屏幕阅读器;
|
||
|
|
9. 原型与最终桌面实现的按钮、结果、任务状态和错误恢复对照。
|
||
|
|
|
||
|
|
## 10. 交付检查清单
|
||
|
|
|
||
|
|
- [ ] 已使用最低干扰层级,不把所有反馈都放进对话框。
|
||
|
|
- [ ] 对话框的阻塞范围、所有者、按钮、默认/取消和结果明确。
|
||
|
|
- [ ] 焦点进入、循环、Escape、关闭和返回调用者符合平台行为。
|
||
|
|
- [ ] 危险操作说明对象与后果,可恢复操作优先撤销。
|
||
|
|
- [ ] 任务具有完整状态、可信进度、取消协议和重复提交防护。
|
||
|
|
- [ ] 错误区分可修复、暂时故障、冲突和不可恢复,并保留用户工作。
|
||
|
|
- [ ] 部分成功显示准确数量并支持失败项恢复。
|
||
|
|
- [ ] 后台线程不操作 GUI,关闭后迟到回调安全忽略。
|
||
|
|
- [ ] 键盘、缩放、高对比度和屏幕阅读器已验证。
|
||
|
|
- [ ] 原型与桌面实现使用同一决策和任务状态契约。
|