mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-19 23:30:44 +08:00
7.5 KiB
7.5 KiB
Splitter API 参考
命名空间
namespace AtomUI.Desktop.Controls;
AXAML 命名空间前缀:atom(xmlns:atom="https://atomui.net")
枚举与辅助类型
SplitterCollapsibleIconDisplayMode
折叠图标显示模式枚举,控制手柄上折叠/展开箭头图标的显示时机。
| 值 | 别名 | 说明 |
|---|---|---|
Hover |
Auto |
鼠标悬浮在手柄上时显示(默认) |
Always |
True |
始终显示 |
Hidden |
False |
始终隐藏 |
SplitterPanelCollapsible
面板折叠配置类,通过 Splitter.Collapsible 附加属性使用。支持从字符串自动转换(TypeConverter)。
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
IsEnabled |
bool |
true |
是否允许折叠 |
ShowCollapsibleIcon |
SplitterCollapsibleIconDisplayMode |
Hover |
折叠图标显示模式 |
AXAML 中的字符串简写语法:
| 字符串值 | 等价配置 |
|---|---|
"True" / "true" |
IsEnabled = true |
"False" / "false" |
IsEnabled = false |
"Hover" |
ShowCollapsibleIcon = Hover |
"Always" |
ShowCollapsibleIcon = Always |
"None" |
ShowCollapsibleIcon = Hidden |
Dimension(来自 AtomUI)
尺寸值结构体,支持百分比和像素两种单位。
| 属性 | 类型 | 说明 |
|---|---|---|
Value |
double |
数值部分 |
UnitType |
DimensionUnitType |
单位类型(Percentage / Pixel) |
IsPercentage |
bool |
是否为百分比 |
IsAbsolute |
bool |
是否为像素 |
AXAML 中的字符串语法:"30%"(百分比)、"200" 或 "200px"(像素)。
SplitterResizeEventArgs
拖拽事件参数类,继承自 EventArgs。
| 属性 | 类型 | 说明 |
|---|---|---|
HandleIndex |
int |
被拖拽的手柄索引(从 0 开始) |
Sizes |
IReadOnlyList<double> |
所有面板的当前尺寸列表(像素值) |
Splitter 公共属性(StyledProperty)
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Orientation |
Orientation |
Orientation.Vertical |
分割方向。Vertical 为左右分割(水平排列面板),Horizontal 为上下分割(垂直排列面板) |
IsLazy |
bool |
false |
延迟渲染模式。为 true 时拖拽过程中仅移动手柄视觉位置,释放后才更新面板尺寸 |
HandleSize |
double |
由 Token SplitBarHandleSize 控制 |
手柄区域的大小(像素),影响手柄的可拖拽范围 |
CollapsePreviousIcon |
IconTemplate? |
null(使用内置方向箭头) |
自定义「向前折叠」按钮图标模板 |
CollapseNextIcon |
IconTemplate? |
null(使用内置方向箭头) |
自定义「向后折叠」按钮图标模板 |
继承自 TemplatedControl 的常用属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
IsEnabled |
bool |
true |
是否启用 |
ClipToBounds |
bool |
true(由主题设置) |
是否裁剪超出边界的内容 |
Height / Width |
double |
NaN |
控件尺寸 |
Splitter 内容属性
| 属性名 | 类型 | 说明 |
|---|---|---|
Children |
Controls([Content]) |
子面板集合。支持在 AXAML 中直接添加子控件,无需显式包裹 |
Splitter 附加属性(AttachedProperty)
以下附加属性设置在 Splitter 的子面板上,用于控制每个面板的布局行为。
| 属性名 | 类型 | 默认值 | 绑定模式 | 说明 |
|---|---|---|---|---|
Splitter.Size |
Dimension? |
null |
TwoWay |
面板当前尺寸。支持百分比("30%")和像素("200")。拖拽过程中会实时更新。为 null 时面板参与弹性分配 |
Splitter.DefaultSize |
Dimension? |
null |
OneWay |
面板初始默认尺寸。仅在 Size 未设置时作为初始值使用 |
Splitter.MinSize |
Dimension? |
null |
OneWay |
面板最小尺寸约束。支持百分比和像素 |
Splitter.MaxSize |
Dimension? |
null |
OneWay |
面板最大尺寸约束。支持百分比和像素 |
Splitter.IsResizable |
bool |
true |
OneWay |
面板是否允许通过拖拽调整大小。设为 false 时相邻手柄不可拖拽 |
Splitter.Collapsible |
SplitterPanelCollapsible? |
null |
OneWay |
面板折叠配置。为 null 时面板不可折叠 |
Splitter.IsCollapsed |
bool |
false |
TwoWay |
面板是否处于折叠状态。可用于编程式控制折叠/展开 |
附加属性 AXAML 用法
<atom:Splitter Orientation="Vertical">
<Border atom:Splitter.Size="30%"
atom:Splitter.MinSize="100"
atom:Splitter.MaxSize="50%"
atom:Splitter.Collapsible="Always"
atom:Splitter.IsCollapsed="False">
<TextBlock>Panel Content</TextBlock>
</Border>
<Border atom:Splitter.DefaultSize="200"
atom:Splitter.IsResizable="False">
<TextBlock>Fixed Panel</TextBlock>
</Border>
</atom:Splitter>
附加属性 C# 用法
// 获取和设置面板尺寸
Dimension? size = Splitter.GetSize(panel);
Splitter.SetSize(panel, new Dimension(30, DimensionUnitType.Percentage));
// 获取和设置折叠配置
Splitter.SetCollapsible(panel, new SplitterPanelCollapsible
{
IsEnabled = true,
ShowCollapsibleIcon = SplitterCollapsibleIconDisplayMode.Always
});
// 编程式折叠/展开
Splitter.SetIsCollapsed(panel, true); // 折叠
Splitter.SetIsCollapsed(panel, false); // 展开
// 约束
Splitter.SetMinSize(panel, new Dimension(100, DimensionUnitType.Pixel));
Splitter.SetMaxSize(panel, new Dimension(50, DimensionUnitType.Percentage));
// 禁止拖拽
Splitter.SetIsResizable(panel, false);
事件
| 事件名 | 类型 | 说明 |
|---|---|---|
ResizeStarted |
EventHandler<SplitterResizeEventArgs> |
拖拽开始时触发,提供拖拽手柄索引和初始面板尺寸 |
ResizeDelta |
EventHandler<SplitterResizeEventArgs> |
拖拽过程中持续触发,提供实时面板尺寸预览 |
ResizeCompleted |
EventHandler<SplitterResizeEventArgs> |
拖拽结束时触发,提供最终面板尺寸 |
事件用法
splitter.ResizeStarted += (sender, e) =>
{
Console.WriteLine($"开始拖拽手柄 {e.HandleIndex}");
Console.WriteLine($"初始尺寸: {string.Join(", ", e.Sizes)}");
};
splitter.ResizeDelta += (sender, e) =>
{
Console.WriteLine($"拖拽中: {string.Join(", ", e.Sizes)}");
};
splitter.ResizeCompleted += (sender, e) =>
{
Console.WriteLine($"拖拽完成: {string.Join(", ", e.Sizes)}");
};
伪类(Pseudo-Classes)
SplitterHandle 伪类
SplitterHandle 是内部控件,其伪类由主题系统使用:
| 伪类 | 触发条件 | 说明 |
|---|---|---|
:pointerover |
鼠标悬浮在手柄上 | 分割线颜色变为 HandleLineHoverColor |
:dragging |
正在拖拽手柄 | 分割线颜色变为 HandleLineDragColor |
内部组件(Internal)
以下组件为 internal 可见性,用户不应直接使用,但了解其结构有助于自定义样式。
SplitterPanel
内部布局面板,继承自 Avalonia.Controls.Panel,负责所有布局和交互逻辑。
SplitterHandle
内部拖拽手柄,继承自 AtomUI.Controls.Primitives.Thumb。
| 属性名 | 类型 | 说明 |
|---|---|---|
Orientation |
Orientation |
手柄方向(从 Splitter 同步) |
LineBrush |
IBrush? |
分割线颜色(由主题控制) |
LineThickness |
double |
分割线粗细(由 Token SplitBarSize 控制) |
IsDragEnabled |
bool |
是否允许拖拽(根据相邻面板 IsResizable 自动计算) |