# Menu 自定义样式指南 本文档介绍如何通过 `Style` 选择器和 `ControlTheme` 覆盖 Menu 控件家族的视觉表现。 --- ## 1. 通过属性直接控制 Menu 控件的大部分视觉属性通过 Design Token 系统控制。以下属性可直接在 AXAML 中设置: ### Menu ```xml ``` ### ContextMenu ```xml ``` ### MenuItem ```xml ``` --- ## 2. 通过 Style 选择器覆盖 ### 2.1 Menu 样式 ```xml ``` ### 2.2 MenuItem 样式(子菜单项) ```xml ``` ### 2.3 顶层菜单项样式 顶层菜单项(直接嵌套在 `Menu` 中的 `MenuItem`)使用 `TopLevelMenuItemTheme` 主题,通过 `:toplevel` 伪类匹配: ```xml ``` ### 2.4 深入模板内部 可以通过 `/template/` 选择器访问模板内部元素: ```xml ``` --- ## 3. 通过 ControlTheme 完全重写 如果需要完全自定义菜单的外观,可以创建新的 `ControlTheme`: ```xml ``` > ⚠️ 完全重写 ControlTheme 需要确保模板中包含必要的 Template Part(如 `PART_Popup`、`PART_ToggleCheckbox` 等),否则会丢失子菜单弹出和 Toggle 功能。 --- ## 样式选择器速查 ### Menu | 选择器 | 说明 | |---|---| | `atom\|Menu` | 匹配所有 Menu | | `atom\|Menu[SizeType=Large]` | 大号菜单 | | `atom\|Menu[SizeType=Middle]` | 中号菜单 | | `atom\|Menu[SizeType=Small]` | 小号菜单 | ### MenuItem | 选择器 | 说明 | |---|---| | `atom\|MenuItem` | 匹配所有 MenuItem | | `atom\|MenuItem:toplevel` | 顶层菜单项(直接在 Menu 中) | | `atom\|MenuItem:pointerover` | 鼠标悬浮 | | `atom\|MenuItem:disabled` | 禁用状态 | | `atom\|MenuItem:checked` | 选中状态 | | `atom\|MenuItem:empty` | 无子菜单项 | | `atom\|MenuItem:pressed` | 按下状态 | | `atom\|MenuItem[IsSubMenuOpen=True]` | 子菜单已打开 | | `atom\|MenuItem[ToggleType=CheckBox]` | CheckBox 类型 | | `atom\|MenuItem[ToggleType=Radio]` | Radio 类型 | | `atom\|MenuItem[SizeType=Large]` | 大号 | | `atom\|MenuItem[SizeType=Small]` | 小号 | ### ContextMenu | 选择器 | 说明 | |---|---| | `atom\|ContextMenu` | 匹配所有 ContextMenu | ### MenuSeparator | 选择器 | 说明 | |---|---| | `atom\|MenuSeparator` | 匹配所有菜单分隔线 | ### 模板内部元素 | 选择器 | 说明 | |---|---| | `atom\|MenuItem /template/ Border#Frame` | 菜单项背景框 | | `atom\|MenuItem /template/ atom\|IconPresenter#ItemIconPresenter` | 图标展示器 | | `atom\|MenuItem /template/ ContentPresenter#ItemTextPresenter` | 文字展示器 | | `atom\|MenuItem /template/ atom\|TextBlock#InputGestureText` | 快捷键文字 | | `atom\|MenuItem /template/ atom\|Icon#MenuIndicatorIcon` | 子菜单箭头 | | `atom\|MenuItem /template/ Border#PopupFrame` | 子菜单弹窗框 | | `atom\|MenuItem /template/ atom\|CheckBox#PART_ToggleCheckbox` | CheckBox 控件 | | `atom\|MenuItem /template/ atom\|RadioButton#PART_ToggleRadio` | RadioButton 控件 | --- ## 4. Token 覆盖(全局主题定制) 通过自定义 `MenuToken` 的值来全局调整所有菜单的视觉表现。详见 [MenuToken.md](MenuToken.md)。 常见的 Token 定制场景: | 定制目标 | Token | |---|---| | 修改悬浮背景色 | `ItemHoverBg` | | 修改菜单项文字色 | `ItemColor` | | 修改禁用文字色 | `ItemDisabledColor` | | 修改弹窗背景色 | `MenuPopupBgColor` | | 修改弹窗最小宽度 | `MenuPopupMinWidth` | | 修改菜单项圆角 | `ItemBorderRadius` | | 修改图标尺寸 | `ItemIconSize` | | 修改快捷键文字颜色 | `KeyGestureColor` |