5.9 KiB
TreeView Token 设计
本文档定义 AtomUI.Desktop.Controls.TreeViewToken 的 TreeView 专属语义、分类、使用范围和兼容边界。控件 Token 的通用分层、命名、计算、Theme Variables 边界和预设色规则见 AtomUI 控件 Token 设计规范。TreeView 整体架构见 TreeView 桌面版架构设计,内部实现原理见 TreeView 桌面版实现原理,设计和契约变化记录见 TreeView Changelog。
1. 定位
TreeViewToken 是 TreeView 的组件级设计变量层。它把全局颜色、尺寸、间距、线宽和状态色转换为 TreeView 节点 header、switcher、icon、拖拽指示器和过滤高亮可消费的语义值。
TreeViewToken 服务以下主题和控件:
TreeViewTheme.axamlTreeViewItemTheme.axamlTreeViewItemHeaderTheme.axamlNodeSwitcherButtonTheme.axamlTreeViewdrag indicator render stateTreeViewItemline render stateTreeViewItemHeaderhover / selected / filter state
TreeViewToken 不承载 SelectedItem、SelectedItems、CheckedItems、IsExpanded、IsChecked、IsFilterMode、FilterResultCount、IsDragging、DragIndicatorRenderInfo 等实例状态。这些状态由 C# 状态模型、容器属性和主题 selector 处理。
2. Token 分类
TreeViewToken 当前按 TreeView 语义分为五类。
2.1 节点尺寸 Token
HeaderHeight
HeaderHeight 控制节点 header 最小高度,同时作为 NodeSwitcherButton 的宽高默认值。它来自 SharedToken.ControlHeightSM,保持树节点紧凑可扫描。
2.2 节点状态色 Token
NodeHoverBgNodeSelectedBgDirectoryNodeSelectedColorDirectoryNodeSelectedBg
NodeHoverBg 用于节点 hover 背景。NodeSelectedBg 用于普通 selected / pressed 背景。DirectoryNodeSelectedColor 和 DirectoryNodeSelectedBg 当前由 Token 类型定义为目录树选中语义,默认 TreeView 主题不直接消费这两个 Token;维护时仍应保持其名称和语义稳定。
节点 disabled 文本色、图标弱化和 switcher 图标色优先使用 SharedToken,不在 TreeViewToken 中重复定义。
2.3 节点结构间距 Token
TreeItemMarginTreeItemHeaderPaddingTreeItemHeaderMarginTreeNodeSwitcherMarginTreeNodeIconMargin
这些 Token 只表达 TreeView 节点结构间距:
TreeItemMargin控制节点行之间的垂直节奏。TreeItemHeaderPadding控制 header 内容内边距。TreeItemHeaderMargin控制 header 内容框与左侧结构区间距。TreeNodeSwitcherMargin控制 switcher 与 checkbox / radio 之间的距离。TreeNodeIconMargin控制节点 icon 与内容之间的距离。
缩进层级由 TreeViewItemTheme.MarginMultiplierConverter 控制,不属于 Token。
2.4 拖拽 Token
DragIndicatorLineWidth
DragIndicatorLineWidth 控制 drop indicator 线宽。拖拽指示线颜色当前来自 SharedToken.ColorPrimary,由 TreeView Theme 绑定到 internal drag indicator brush。
拖拽位置、目标节点和 indicator 坐标属于运行时状态,不进入 Token。
2.5 过滤 Token
FilterHighlightColor
FilterHighlightColor 控制 filter match 文字高亮前景,默认来自 SharedToken.ColorError。过滤是否命中、命中词和生成的 inline runs 属于实例状态,不进入 Token。
3. 控件专项模型中的 Token 使用
TreeView Token 主要参与以下专项模型:
- hover mode:
NodeHoverBg和NodeSelectedBg同时服务Default、Block、WholeLine三种 hover 背景范围。 - switcher:
HeaderHeight控制 switcher hit size,TreeNodeSwitcherMargin控制 toggle 模式下 switcher 间距。 - icon:
TreeNodeIconMargin控制节点 icon 与 header 内容间距,icon 尺寸来自 SharedToken。 - drag/drop:
DragIndicatorLineWidth控制 drop indicator 线宽,颜色来自 SharedToken 主色。 - filter:
FilterHighlightColor通过FilterHighlightForeground传递到 header highlighter。
Token 不参与 default selected / checked / expanded path 回放,不参与 CheckedItems 同步,不参与异步加载逻辑。
4. 控件家族影响
TreeViewToken 影响 TreeView 与 TreeViewItem 体系:
TreeViewroot theme 绑定 filter highlight、empty padding、motion、drag indicator 线宽和颜色。TreeViewItemHeader使用节点高度、行间距、header padding、hover / selected 背景和 filter highlight。NodeSwitcherButton使用HeaderHeight作为 switcher 区域尺寸,并使用NodeHoverBg作为 pointerover 背景。FloatableTreeView继承 TreeView 的 Token 语义,不定义独立 Token。
TreeViewToken 不影响 NavMenu、Masonry、GroupBox 或其他 Data Display 控件。
5. 兼容性要求
维护 TreeViewToken 时必须保持以下要求:
- 不擅自重命名、删除或改变
TreeViewTokenKind对应 Token 语义。 - 不把节点运行时状态写入 Token。
- 不把过滤结果、拖拽目标、当前选择、当前勾选或展开状态写入 Token。
- 不把
NodeHoverMode、ToggleType、FilterStrategy等实例配置拆成 Token。 - 默认值应继续从 SharedToken 派生,保持 light / dark 主题一致性。
- Token 变更必须同步 Theme 引用和 token.md 语义说明。
6. 验证策略
TreeViewToken 变更验证:
TreeViewTokenKind与 token.md 语义说明保持一致。HeaderHeight影响 header 最小高度和 switcher 尺寸。NodeHoverBg/NodeSelectedBg在三种 hover mode 下均命中正确背景层。TreeItemMargin、TreeItemHeaderPadding、TreeItemHeaderMargin、TreeNodeSwitcherMargin、TreeNodeIconMargin不造成 header 内容重叠。DragIndicatorLineWidth与实际 drop indicator render line width 一致。FilterHighlightColor能传递到 filter highlight runs。- Light / dark 主题下 hover、selected、disabled、filter 和 drag indicator 可读性稳定。