# Splitter 使用文档 本文档介绍 AtomUI Splitter 控件的各种使用方式,示例代码摘自 Gallery 演示程序。 > 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/Layout/SplitterShowCase.axaml` --- ## 前置准备 在 AXAML 中使用 Splitter,需要引入以下命名空间: ```xml xmlns:atom="https://atomui.net" xmlns:antdicons="https://atomui.net/icons/antdesign" ``` 在 C# 代码中引入: ```csharp using AtomUI.Desktop.Controls; // Splitter 控件 using AtomUI; // Dimension 类型 ``` --- ## 1. 基本分割 最简单的用法——在 Splitter 中放入两个子面板,自动生成拖拽手柄: ```xml First Second ``` **要点说明**: - `Orientation="Vertical"` 表示面板水平排列(左右分割),手柄为竖线 - 第一个面板使用 `Size="30%"` 百分比尺寸,拖拽过程中实时更新 - 第二个面板使用 `DefaultSize="100"` 像素初始尺寸 + `MinSize="60"` 最小约束 > 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/Layout/SplitterShowCase.axaml` 中 "Basic" 示例。 --- ## 2. 水平分割 设置 `Orientation="Horizontal"` 实现上下分割: ```xml Top Bottom ``` **方向对照表**: | Orientation | 面板排列方向 | 手柄方向 | 拖拽方向 | |---|---|---|---| | `Vertical` | 左右排列 | 竖线 | 水平拖拽 | | `Horizontal` | 上下排列 | 横线 | 垂直拖拽 | > 📖 参考:Gallery 中 "Horizontal" 示例。 --- ## 3. 嵌套分割 水平与垂直 Splitter 可以嵌套,构建复杂的多区域 IDE 风格布局: ```xml Left Top Bottom ``` **效果**:左侧为独立面板,右侧区域被二次水平分割为上下两部分。 > 📖 参考:Gallery 中 "Composite" 示例。 --- ## 4. 多面板分割 Splitter 支持任意数量的子面板,系统自动在每对相邻面板间插入手柄: ```xml A B C D ``` **尺寸分配规则**: - A 和 B 分别占可用空间的 20% - C 和 D 未指定尺寸,平分剩余 60% 空间 > 📖 参考:Gallery 中 "Multi Panels" 示例。 --- ## 5. 禁用拖拽 通过 `Splitter.IsResizable="False"` 禁止特定面板参与拖拽: ```xml Resizable Not Resizable Resizable ``` **行为说明**: - 中间面板设置了 `IsResizable="False"` - 左侧手柄(A|B 之间)不可拖拽,因为 B 不可调整大小 - 右侧手柄(B|C 之间)不可拖拽,因为 B 不可调整大小 - 拖拽光标不会出现在这两个手柄上 > 📖 参考:Gallery 中 "Resizable Disabled" 示例。 --- ## 6. 面板折叠 通过 `Splitter.Collapsible` 配置面板可折叠。AXAML 中支持字符串简写: ```xml First Second Third ``` ### 在代码中动态切换折叠图标显示模式 ```csharp // 设置面板可折叠,折叠图标始终显示 Splitter.SetCollapsible(panel, new SplitterPanelCollapsible { IsEnabled = true, ShowCollapsibleIcon = SplitterCollapsibleIconDisplayMode.Always }); // 切换为悬浮时显示 Splitter.SetCollapsible(panel, new SplitterPanelCollapsible { IsEnabled = true, ShowCollapsibleIcon = SplitterCollapsibleIconDisplayMode.Hover }); // 隐藏折叠图标但保留折叠功能 Splitter.SetCollapsible(panel, new SplitterPanelCollapsible { IsEnabled = true, ShowCollapsibleIcon = SplitterCollapsibleIconDisplayMode.Hidden }); ``` > 📖 参考:Gallery 中 "ShowCollapsibleIcon" 示例及其 code-behind `SplitterShowCase.axaml.cs`。 --- ## 7. 编程式折叠/展开 通过 `Splitter.IsCollapsed` 附加属性编程式控制面板状态: ```xml Left Right ``` ```csharp // C# Code-behind 或 ViewModel // 折叠面板 Splitter.SetIsCollapsed(LeftPanel, true); // 展开面板 Splitter.SetIsCollapsed(LeftPanel, false); ``` --- ## 8. 延迟渲染模式 当面板内容渲染开销较大时,使用 `IsLazy="True"` 提升拖拽流畅度: ```xml First Second First Second ``` **行为差异**: - `IsLazy="False"`(默认):拖拽时面板尺寸实时更新 - `IsLazy="True"`:拖拽时仅移动手柄视觉位置(`RenderTransform`),释放鼠标后一次性更新所有面板尺寸 > 📖 参考:Gallery 中 "Lazy" 示例。 --- ## 9. 自定义折叠图标 通过 `CollapsePreviousIcon` 和 `CollapseNextIcon` 替换默认方向箭头: ```xml Left Right ``` **默认图标**(未设置自定义图标时): | 方向 | Previous 图标 | Next 图标 | |---|---|---| | `Vertical`(左右分割) | `LeftOutlined` ← | `RightOutlined` → | | `Horizontal`(上下分割) | `UpOutlined` ↑ | `DownOutlined` ↓ | --- ## 10. 监听拖拽事件 通过 `ResizeStarted`、`ResizeDelta`、`ResizeCompleted` 事件监听面板尺寸变化: ```xml A B ``` ```csharp private void HandleResizeStarted(object? sender, SplitterResizeEventArgs e) { Console.WriteLine($"开始拖拽手柄 #{e.HandleIndex}"); Console.WriteLine($"初始尺寸: [{string.Join(", ", e.Sizes.Select(s => $"{s:F1}px"))}]"); } private void HandleResizeDelta(object? sender, SplitterResizeEventArgs e) { // 拖拽过程中持续触发,可用于实时显示面板尺寸 Console.WriteLine($"当前尺寸: [{string.Join(", ", e.Sizes.Select(s => $"{s:F1}px"))}]"); } private void HandleResizeCompleted(object? sender, SplitterResizeEventArgs e) { Console.WriteLine($"拖拽完成,最终尺寸: [{string.Join(", ", e.Sizes.Select(s => $"{s:F1}px"))}]"); } ``` --- ## 11. 尺寸约束 通过 `MinSize` 和 `MaxSize` 限制面板的可调范围: ```xml Constrained Flexible ``` **支持的尺寸格式**: - 像素:`"100"`、`"200px"` - 百分比:`"30%"`、`"50%"` - 百分比和像素可在同一 Splitter 中混合使用 --- ## 常见组合模式 ### IDE 三栏布局 ```xml Explorer Editor Terminal Properties ``` ### 仪表盘布局 ```xml Chart A Chart B Stats Logs Alerts ``` ### 固定侧边栏 + 可折叠面板 ```xml Nav Sidebar Main Content ```