K2.03.3menu item availability sync设计

菜单项需与实际可用状态同步

别名: 菜单项灰显 · 过期可用态 · stale menu enablement

概念解释

菜单项亮着,按下就应该真的能做;灰着,现在就不该能做。与实际可用状态同步指菜单上的可点性跟着当前文档、当前选择、当前权限一起变,而不是一份打开时算一次、之后不再更新的静图。

不同步有两种脸。亮着却失败:人选了「粘贴」,得到一声铃或一句「现在不行」。灰着却本来可以:选择已经满足条件,项还停在上一次的禁用,人以为功能坏了。

机制

菜单栏被当成当前能力的仪表。人在打开菜单的那一瞬读取「此刻能做什么」,再决定要不要点。这份读数若滞后于真实状态,决策用的是过期仪表。滞后来自缓存:项的启用在窗口激活时算一次、在选择变化时没重算,或异步权限回来了却没刷新。桌面菜单可以在指针还没点下去之前就展开,展开到按下之间又过了几百毫秒,选择若在这间隙被协作对方改掉,按下那一刻仍要对着按下时的状态执行,而不是对着展开时的快照。

失败之所以刺,是因为菜单刚才还在声称这件事存在且可用。工具栏按钮同样会过期,但菜单被当作完整清单来读,一条过期项会污染整份目录的可信度:人会开始不相信灰亮。

边界

耗时权限检查(网络、硬件)无法在展开菜单的那一帧内完成,允许先以「未知」呈现再很快换成真值,但不能长期停在错的真值上。只读文档、无选区、剪贴板空,这些本地条件应当在展开前就算完。演示模式或录屏为了画面干净冻结菜单,是临时的假仪表,演示结束必须解冻。多窗口里每一窗口的菜单要跟自己的文档走,不要用前一个窗口的可用态去画后一个。

怎么落地

  • 在选择变化、剪贴板变化、文档权限变化时重算菜单项的启用;不要只在应用启动或窗口激活时算一次。
  • 点下一记当时显示为可用的命令,若此刻已经不可用,按失败处理并说清原因,不要静默吞掉。
  • 验证:选中一段文字,「复制」应亮;取消选择,「复制」应灭。复制之后切到一个只读窗口,「粘贴」应灭。用自动化改掉选区后再点仍亮着的项,结果必须与点击那一瞬的状态一致,而不是与菜单刚展开时一致。

延伸

  • 同组K2.03.1 菜单栏提供功能的完整清单 · K2.03.2 菜单是发现功能与学习快捷键的主渠道
  • 相邻K2.09 菜单栏与命令组织 · D1.07 禁用态
  • 站内检索menu enablement · stale UI state · command availability

同组卡片

快捷操作

分享

分享当前页面

ios_share

https://hci.top/zh/handbook/K2.03.3