# 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` |