DirectSurface UIDirectSurface UI
开始使用
文档/核心概念

组件基础状态契约

DirectSurface UI 的业务组件应把基础状态暴露为可由页面状态直接驱动的公开能力。业务权限、流程状态、表单模式和上下文切换可以在业务层计算,但组件本身需要提供一致的 UI 表达和交互清理。

状态分层

状态 所属层级 语义 典型来源
visible 所有 RenderObject 是否参与布局、绘制、hit test 和焦点。 权限、页面模式、条件字段。
disabled 可交互控件 控件不可操作,不进入焦点顺序,清理 hover、pressed、popup、拖拽等临时状态。 权限不足、业务条件不满足、流程锁定。
readonly 输入或选择控件 值可展示,通常可复制或查看,但不能修改。 审核模式、归档记录、只读详情页。

visible 是基础渲染状态,所有 render object 都继承。disabledreadonly 是组件公开 API,只有具备对应交互语义的组件才提供。

visible

object.visible = false 表示折叠隐藏:

  • 不参与父布局。
  • 不绘制。
  • 不参与 hit test。
  • 不进入焦点顺序。
  • 对已有焦点的控件,组件基础类会在隐藏时释放焦点。

业务权限只需要控制组件是否出现时,优先使用 visible。如果需要保留布局占位但临时不绘制,使用 RenderVisibilityhidden 模式。

disabled

disabled 表示控件当前不可操作。可交互组件提供整体禁用能力时,应满足:

  • 禁用后不响应 pointer、keyboard、shortcut 或 popup 激活。
  • 禁用后从 FocusManager 的焦点顺序中移除。
  • 若禁用前持有焦点,立即释放焦点。
  • 清理 hover、pressed、keyboard active、拖拽、弹窗、菜单、临时捕获等内部状态。
  • 视觉上使用主题的 disabled 状态色。

局部项也可以有自己的 disabled,例如菜单项、面包屑项、工具栏项或单选选项。整体 disabled 优先级更高:整体禁用后所有子项都按不可交互处理。

readonly

readonly 用于值类控件,表达“可看但不可改”。它和 disabled 的区别是:

行为 readonly disabled
展示当前值
编辑值
焦点 由组件语义决定
文本选择或复制 输入类控件通常允许 通常不允许
视觉 保持可读状态 使用 disabled 弱化状态

例如 RenderTextBoxRenderTextArea 在只读时仍适合展示可复制内容;下拉选择器、日期选择器、颜色选择器在只读时不应打开 popup。

业务接入建议

业务层负责计算权限和状态,组件层负责执行 UI 状态:

saveButton.disabled = !canSave
advancedPanel.visible = canViewAdvanced
patientName.readonly = isArchived

对于命令型入口,优先使用命令系统统一计算 visible/enabled,再把结果映射到按钮、菜单和工具栏。对于纯表单或页面局部状态,可以直接设置组件的 visibledisabledreadonly

状态变化后,如果修改会影响布局,例如 visible、文本长度、字段结构或分组内容,需要让父布局重新 layout。单纯 disabled/readonly 通常只需要组件自身重绘,组件 setter 会处理。