# TreeView 自定义样式指南 TreeView 的视觉表现通过 `ControlTheme` + Design Token 系统控制。以下介绍几种常见的自定义方式。 --- ## 1. 使用属性直接控制 最简单的方式是通过 TreeView 的公共属性来控制外观和行为: ```xml ``` > 📖 完整示例参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TreeViewShowCase.axaml` --- ## 2. 通过 Style 覆盖样式 可以在 AXAML 中使用 `Style` 对 TreeView 和 TreeViewItem 进行全局或局部样式覆盖: ### 全局设置连接线和展开行为 ```xml ``` ### 自定义选中节点样式 ```xml ``` ### 自定义勾选模式下的节点 ```xml ``` ### 根据悬浮模式定制背景 ```xml ``` --- ## 3. 自定义展开/折叠图标 通过 `SwitcherRotationIcon`、`SwitcherExpandIcon`、`SwitcherCollapseIcon` 属性自定义展开/折叠图标: ### 旋转图标模式 ```xml ``` ### 替换图标模式 ```xml ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TreeViewShowCase.axaml` 中 "Customize collapse/expand icon" 示例。 --- ## 4. 通过 TreeDataTemplate 数据绑定 使用 `ItemsSource` + `TreeDataTemplate` 实现 MVVM 数据驱动: ```xml ``` ```csharp // Code-behind 或 ViewModel myTreeView.ItemsSource = new List { new TreeItemNode() { Header = "parent 1", ItemKey = "0-0", Children = [ new TreeItemNode() { Header = "leaf 1", ItemKey = "0-0-0" }, new TreeItemNode() { Header = "leaf 2", ItemKey = "0-0-1" } ] } }; ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TreeViewShowCase.axaml` 中 "Generate by template" 示例。 --- ## 5. 搜索过滤示例 通过配合 `SearchEdit` 实现树节点搜索: ```xml ``` ```csharp private void HandleFilterTreeClicked(object? sender, RoutedEventArgs e) { if (sender is SearchEdit searchEdit) { SearchTreeView.FilterValue = searchEdit.Text?.Trim(); } } ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TreeViewShowCase.axaml` 中 "Searchable" 示例。 --- ## 6. 异步加载示例 通过 `DataLoader` 实现展开时异步加载子节点: ```xml ``` ```csharp // 初始化数据 AsyncLoadTree.ItemsSource = new List { new TreeItemNode() { Header = "Expand to load", ItemKey = "0" }, new TreeItemNode() { Header = "Expand to load", ItemKey = "1" }, new TreeItemNode() { Header = "Tree Node", ItemKey = "2", IsLeaf = true } }; // 设置加载器 AsyncLoadTree.DataLoader = new TreeItemDataLoader(); ``` ```csharp // 自定义加载器实现 public class TreeItemDataLoader : ITreeItemNodeLoader { public async Task LoadAsync(ITreeItemNode targetTreeItem, CancellationToken token) { await Task.Delay(1000, token); // 模拟异步加载 return new TreeItemLoadResult { IsSuccess = true, Data = new List { new TreeItemNode() { Header = "Child 1", ItemKey = "child-1" }, new TreeItemNode() { Header = "Child 2", ItemKey = "child-2", IsLeaf = true } }.AsReadOnly() }; } } ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TreeViewShowCase.axaml` 中 "load data asynchronously" 示例。 --- ## 7. 默认展开和选中路径 通过路径指定初始展开、选中和勾选状态: ```csharp // 默认展开路径 myTreeView.DefaultExpandedPaths = new List { new TreeNodePath("0-0/0-0-0"), new TreeNodePath("0-0/0-0-1/0-0-1-1") }; // 默认选中路径 myTreeView.DefaultSelectedPaths = new List { new TreeNodePath("0-0/0-0-1") }; // 默认勾选路径 myTreeView.DefaultCheckedPaths = new List { new TreeNodePath("0-0/0-0-1/0-0-1-1") }; ``` > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/TreeViewShowCase.axaml.cs` 中 `InitBasicTreeViewData` 方法。 --- ## 8. 控制动画行为 ```xml ``` ```csharp // 代码中全部展开(不带动画) myTreeView.ExpandAll(motionEnabled: false); // 代码中全部展开(带动画) myTreeView.ExpandAll(motionEnabled: true); ``` --- ## 样式选择器速查 > 说明:Avalonia 样式选择器中使用 `atom|TreeView` 语法引用 `atom` XML 命名空间下的类型,其中 `|` 是命名空间分隔符。 ### TreeView 选择器 | 选择器 | 说明 | |---|---| | `atom\|TreeView` | 匹配所有 AtomUI TreeView 实例 | | `atom\|TreeView:draggable` | 匹配启用了拖拽功能的 TreeView | | `atom\|TreeView[NodeHoverMode=Block]` | 匹配 Block 悬浮模式的 TreeView | | `atom\|TreeView[NodeHoverMode=WholeLine]` | 匹配 WholeLine 悬浮模式的 TreeView | | `atom\|TreeView[IsShowLine=True]` | 匹配显示连接线的 TreeView | | `atom\|TreeView:disabled` | 匹配禁用状态的 TreeView | ### TreeViewItem 选择器 | 选择器 | 说明 | |---|---| | `atom\|TreeViewItem` | 匹配所有树节点 | | `atom\|TreeViewItem:selected` | 匹配选中的节点 | | `atom\|TreeViewItem:expanded` | 匹配展开的节点 | | `atom\|TreeViewItem:checked` | 匹配勾选的节点 | | `atom\|TreeViewItem:toggle` | 匹配 CheckBox 勾选模式的节点 | | `atom\|TreeViewItem:radio` | 匹配 Radio 单选模式的节点 | | `atom\|TreeViewItem:disabled` | 匹配禁用的节点 | | `atom\|TreeViewItem:pointerover` | 匹配鼠标悬浮的节点 | ### 组合选择器示例 | 选择器 | 说明 | |---|---| | `atom\|TreeViewItem:selected:not(:disabled)` | 非禁用状态下已选中的节点 | | `atom\|TreeViewItem:toggle:checked` | CheckBox 模式下已勾选的节点 | | `atom\|TreeView[IsShowLine=True] atom\|TreeViewItem:expanded` | 显示连接线的 TreeView 中展开的节点 | | `atom\|TreeViewItem /template/ atom\|TreeViewItemHeader` | 访问节点模板内的标题区域 |