# TreeSelect 自定义样式指南
TreeSelect 的视觉表现通过 `ControlTheme` + Design Token 系统控制。以下介绍几种常见的自定义方式。
---
## 1. 使用属性直接控制
最简单的方式是通过 TreeSelect 的公共属性来控制外观:
```xml
```
> 📖 完整示例参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/TreeSelectShowCase.axaml`
---
## 2. 通过 Style 覆盖样式
可以在 AXAML 中使用 `Style` 对 TreeSelect 进行全局或局部样式覆盖:
### 全局统一宽度
```xml
```
### 按样式变体定制边框颜色
```xml
```
### 按状态定制
```xml
```
### 使用伪类选择器
```xml
```
### 按属性选择器
```xml
```
---
## 3. 通过 ControlTheme 完全替换主题
如果需要彻底替换 TreeSelect 的模板和样式,可以定义自定义 `ControlTheme`:
```xml
```
> ⚠️ 注意:完全替换 ControlTheme 将丢失内置的弹窗管理、装饰框、筛选、树线等功能。建议优先使用 Style 覆盖。
---
## 4. 自定义弹窗弹出位置
通过 `Placement` 属性和 `IsPopupMatchSelectWidth` 属性控制弹窗行为:
```xml
```
> 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/TreeSelectShowCase.axaml` 中 "Placement" 示例。
---
## 5. 自定义筛选高亮
通过 `FilterHighlightForeground` 和 `FilterHighlightStrategy` 控制搜索匹配的高亮效果:
```xml
```
---
## 6. 控制动画行为
```xml
```
---
## 样式选择器速查
> 说明:Avalonia 样式选择器中使用 `atom|TreeSelect` 语法引用 `atom` XML 命名空间下的 `TreeSelect` 类型,其中 `|` 是命名空间分隔符。
### 基础选择器
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect` | 匹配所有 AtomUI TreeSelect 实例 |
| `atom\|TreeSelect:disabled` | 匹配禁用状态 |
| `atom\|TreeSelect:dropdownopen` | 匹配下拉弹窗打开状态 |
| `atom\|TreeSelect:pressed` | 匹配按下状态 |
| `atom\|TreeSelect:focus-within` | 匹配内部获得焦点的状态 |
### 按样式变体选择
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect:outline` | 匹配 Outline 变体(带边框,默认) |
| `atom\|TreeSelect:filled` | 匹配 Filled 变体(填充背景) |
| `atom\|TreeSelect:borderless` | 匹配 Borderless 变体(无边框) |
### 按状态选择
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect:error` | 匹配错误状态(`Status == Error`) |
| `atom\|TreeSelect:warning` | 匹配警告状态(`Status == Warning`) |
### 按尺寸选择
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect[SizeType=Large]` | 匹配大号 TreeSelect |
| `atom\|TreeSelect[SizeType=Middle]` | 匹配中号 TreeSelect(默认) |
| `atom\|TreeSelect[SizeType=Small]` | 匹配小号 TreeSelect |
### 按属性选择
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect[IsMultiple=True]` | 匹配多选模式 |
| `atom\|TreeSelect[IsMultiple=False]` | 匹配单选模式 |
| `atom\|TreeSelect[IsFilterEnabled=True]` | 匹配启用了搜索筛选的 TreeSelect |
| `atom\|TreeSelect[IsDropDownOpen=True]` | 匹配下拉弹窗打开状态(属性选择器写法) |
| `atom\|TreeSelect[StyleVariant=Filled]` | 按属性匹配 Filled 变体 |
| `atom\|TreeSelect[Status=Error]` | 按属性匹配错误状态 |
### 模板部件访问
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect /template/ atom\|TreeSelectAddOnDecoratedBox#PART_AddOnDecoratedBox` | 访问装饰框部件 |
| `atom\|TreeSelect /template/ Border#PopupFrame` | 访问弹窗容器 Border |
| `atom\|TreeSelect /template/ ContentPresenter#SingleSelectResultPresenter` | 访问单选模式下的选中项展示器 |
| `atom\|TreeSelect /template/ atom\|SelectFilterTextBox#PART_SingleFilterInput` | 访问单选搜索输入框 |
| `atom\|TreeSelect /template/ atom\|SelectTagAwareTextBox#SelectedItemsBox` | 访问多选模式下的 Tag 容器 |
| `atom\|TreeSelect /template/ atom\|TreeSelectTreeView#PART_TreeView` | 访问内嵌 TreeView |
### 组合选择器示例
| 选择器 | 说明 |
|---|---|
| `atom\|TreeSelect[IsMultiple=False][IsFilterEnabled=False]` | 单选且未启用筛选的 TreeSelect |
| `atom\|TreeSelect[IsMultiple=False][IsFilterEnabled=True]:dropdownopen` | 单选筛选模式下弹窗打开时 |
| `atom\|TreeSelect[IsMultiple=True]:not(:disabled)` | 非禁用的多选 TreeSelect |
| `atom\|TreeSelect:error:outline` | Outline 变体 + 错误状态 |
| `atom\|TreeSelect:warning:filled` | Filled 变体 + 警告状态 |