Files

375 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Select API 参考
## 命名空间
```csharp
namespace AtomUI.Desktop.Controls;
```
AXAML 命名空间前缀:`atom`(`xmlns:atom="https://atomui.net"`)
---
## 枚举类型
### SelectMode
选择模式枚举,定义 Select 的选择行为。
| 值 | 说明 |
|---|---|
| `Single` | 单选模式,选中后下拉自动关闭 |
| `Multiple` | 多选模式,已选项以标签形式展示 |
| `Tags` | 标签模式,在多选基础上允许自由输入创建新标签 |
### SelectPopupPlacement
下拉弹出面板的位置枚举。
| 值 | 说明 |
|---|---|
| `TopEdgeAlignedLeft` | 上方弹出,左对齐 |
| `TopEdgeAlignedRight` | 上方弹出,右对齐 |
| `BottomEdgeAlignedLeft` | 下方弹出,左对齐(默认) |
| `BottomEdgeAlignedRight` | 下方弹出,右对齐 |
### InputControlStyleVariant(来自 `AtomUI.Controls`)
输入控件样式变体枚举。
| 值 | 说明 |
|---|---|
| `Outline` | 有边框轮廓(默认) |
| `Filled` | 填充背景 |
| `Borderless` | 无边框 |
### InputControlStatus(来自 `AtomUI.Controls`)
输入控件验证状态枚举。
| 值 | 说明 |
|---|---|
| `Default` | 默认状态 |
| `Error` | 错误状态(红色边框) |
| `Warning` | 警告状态(橙色边框) |
### SizeType(来自 `AtomUI.Controls`)
尺寸类型枚举。
| 值 | 说明 |
|---|---|
| `Small` | 小号 |
| `Middle` | 中号(默认) |
| `Large` | 大号 |
---
## 核心数据类型
### ISelectOption 接口
选项数据接口,继承自 `IListItemData`。
```csharp
public interface ISelectOption : IListItemData
{
object? Header { get; } // 选项显示文本
bool IsDynamicAdded { get; } // 是否为 Tags 模式动态添加的选项
}
```
### SelectOption 记录类
内置的 `ISelectOption` 实现,支持分组。
```csharp
public record SelectOption : ListItemData, ISelectOption, IGroupListItemData
{
public object? Header { get; init; }
public bool IsDynamicAdded { get; init; } = false;
}
```
`ListItemData` 基类提供的关键属性:
| 属性 | 类型 | 说明 |
|---|---|---|
| `Content` | `object?` | 选项的值(用于匹配和提交) |
| `IsEnabled` | `bool` | 是否可选 |
| `Group` | `string?` | 分组名称(配合 `IsGroupEnabled` 使用) |
### ISelectOptionsAsyncLoader 接口
异步选项加载器接口。
```csharp
public interface ISelectOptionsAsyncLoader
{
Task<SelectOptionsLoadResult> LoadAsync(object? context, CancellationToken token);
}
```
### SelectOptionsLoadResult
异步加载结果。
| 属性 | 类型 | 说明 |
|---|---|---|
| `IsSuccess` | `bool` | 加载是否成功 |
| `StatusCode` | `RpcStatusCode` | 状态码 |
| `UserFriendlyMessage` | `string?` | 用户友好的错误信息 |
| `Data` | `IReadOnlyList<ISelectOption>?` | 加载到的选项数据 |
### SelectSelectionChangedEventArgs
选择变更事件参数。
| 属性 | 类型 | 说明 |
|---|---|---|
| `Mode` | `SelectMode` | 当前选择模式 |
| `OldValue` | `object?` | 变更前的值 |
| `NewValue` | `object?` | 变更后的值 |
### ISelectTagTextProvider 接口
自定义标签文本提供器接口。
```csharp
public interface ISelectTagTextProvider
{
string? TagText { get; }
}
```
---
## AbstractSelect 公共属性
以下属性定义在 `AbstractSelect` 基类中,`Select` 自动继承。
### 基础行为属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `IsAllowClear` | `bool` | `false` | 是否显示清除按钮,允许一键清空已选值 |
| `IsAutoClearSearchValue` | `bool` | `false` | 选中选项后是否自动清除搜索文本 |
| `IsDefaultOpen` | `bool` | `false` | 初始渲染时是否默认展开下拉 |
| `IsDropDownOpen` | `bool` | `false` | 控制下拉面板的展开/关闭状态 |
| `IsFilterEnabled` | `bool` | `false` | 是否启用搜索过滤功能 |
| `IsPopupMatchSelectWidth` | `bool` | `true` | 下拉面板宽度是否与 Select 控件等宽 |
| `DisplayPageSize` | `int` | `10` | 下拉面板最多可见的选项条数(控制最大高度) |
| `Placement` | `SelectPopupPlacement` | `BottomEdgeAlignedLeft` | 下拉面板弹出位置 |
| `FilterValue` | `object?` | `null` | 当前搜索过滤值 |
### 占位文本属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `PlaceholderText` | `string?` | `null` | 未选中时显示的占位提示文本 |
| `PlaceholderForeground` | `IBrush?` | 由 Token 控制 | 占位文本颜色 |
### 多选标签属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `MaxCount` | `int` | `int.MaxValue` | 最大可选数量限制 |
| `IsShowMaxCountIndicator` | `bool` | `false` | 是否显示最大选择数指示器(如 `2/5`) |
| `MaxTagCount` | `int?` | `null` | 最多显示的标签数量,超出折叠为 `+N` |
| `IsResponsiveTagMode` | `bool` | `false` | 根据控件宽度自动计算可见标签数 |
| `MaxTagPlaceholder` | `string?` | `null` | 标签折叠后的自定义占位文本 |
### 图标属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `ClearIcon` | `PathIcon?` | `null` | 自定义清除图标 |
| `SuffixIcon` | `PathIcon?` | `DownOutlined` | 下拉箭头图标 |
| `SuffixLoadingIcon` | `PathIcon?` | `LoadingOutlined`(旋转) | 加载中图标 |
### 样式与状态属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `StyleVariant` | `InputControlStyleVariant` | `Outline` | 样式变体(Outlined/Filled/Borderless) |
| `Status` | `InputControlStatus` | `Default` | 验证状态(Default/Error/Warning) |
| `SizeType` | `SizeType` | `Middle` | 控件尺寸 |
| `IsMotionEnabled` | `bool` | 跟随全局 Token | 是否启用动画效果 |
### AddOn 装饰属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `LeftAddOn` | `object?` | `null` | 左侧外部附加内容 |
| `LeftAddOnTemplate` | `IDataTemplate?` | `null` | 左侧外部附加内容模板 |
| `RightAddOn` | `object?` | `null` | 右侧外部附加内容 |
| `RightAddOnTemplate` | `IDataTemplate?` | `null` | 右侧外部附加内容模板 |
| `ContentLeftAddOn` | `object?` | `null` | 左侧内部前缀内容(如文本 `"User"`) |
| `ContentLeftAddOnTemplate` | `IDataTemplate?` | `null` | 左侧内部前缀内容模板 |
| `ContentRightAddOn` | `object?` | `null` | 右侧内部后缀内容 |
| `ContentRightAddOnTemplate` | `IDataTemplate?` | `null` | 右侧内部后缀内容模板 |
### 空状态指示属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `EmptyIndicator` | `object?` | `null` | 空状态指示器内容 |
| `EmptyIndicatorTemplate` | `IDataTemplate?` | `null` | 空状态指示器模板 |
| `IsShowEmptyIndicator` | `bool` | `true` | 是否在选项为空时显示空状态指示器 |
| `EmptyIndicatorPadding` | `Thickness` | 默认值 | 空状态指示器内边距 |
### 只读属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| `IsLoading` | `bool` | 是否正在异步加载选项(只读) |
---
## Select 公共属性
以下属性定义在 `Select` 类中(继承 `AbstractSelect`)。
### 核心属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Mode` | `SelectMode` | `Single` | 选择模式:Single / Multiple / Tags |
| `OptionsSource` | `IEnumerable<ISelectOption>?` | `null` | 绑定的选项数据源 |
| `OptionTemplate` | `IDataTemplate?` | 默认显示 `Header` | 自定义选项渲染模板 |
| `OptionFontSize` | `double` | 由 Token 控制 | 选项字体大小 |
| `IsDefaultActiveFirstOption` | `bool` | `false` | 是否默认激活第一个选项 |
| `IsGroupEnabled` | `bool` | `false` | 是否启用选项分组 |
| `GroupPropertySelector` | `DefaultFilterValueSelector?` | `null` | 分组属性提取函数 |
| `IsHideSelectedOptions` | `bool` | `false` | 多选时是否隐藏已选选项 |
| `AutoScrollToSelectedOptions` | `bool` | `false` | 展开时是否自动滚动到已选选项 |
### 选中值属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| `SelectedOption` | `ISelectOption?` | 单选模式下的已选选项(DirectProperty,支持双向绑定) |
| `SelectedOptions` | `IList<ISelectOption>?` | 多选/标签模式下的已选选项列表(DirectProperty) |
| `Options` | `ItemCollection` | 选项集合(`[Content]` 属性,支持 AXAML 直接声明子元素) |
### 搜索过滤属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Filter` | `IValueFilter?` | `null` | 自定义过滤器实现 |
| `FilterValueSelector` | `DefaultFilterValueSelector?` | `HeaderFilterPropertySelector` | 过滤值提取函数 |
### 异步加载属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `OptionsLoader` | `ISelectOptionsAsyncLoader?` | `null` | 异步选项加载器 |
| `OptionsAsyncLoadContext` | `object?` | `null` | 传递给加载器的上下文对象 |
### 默认值属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| `DefaultValues` | `IList<object>?` | 默认选中值列表(通过 `Content` 值匹配) |
| `DefaultValueCompareFn` | `Func<object, ISelectOption, bool>?` | 自定义默认值比较函数 |
---
## 事件
### AbstractSelect 事件
| 事件名 | 类型 | 说明 |
|---|---|---|
| `DropDownOpening` | `EventHandler<CancelEventArgs>` | 下拉即将展开(可取消) |
| `DropDownOpened` | `EventHandler` | 下拉已展开 |
| `DropDownClosing` | `EventHandler<CancelEventArgs>` | 下拉即将关闭(可取消) |
| `DropDownClosed` | `EventHandler` | 下拉已关闭 |
### Select 事件
| 事件名 | 类型 | 说明 |
|---|---|---|
| `SelectionChanged` | `EventHandler<SelectSelectionChangedEventArgs>` | 选中值变更 |
| `OptionsLoading` | `EventHandler<SelectOptionsLoadingEventArgs>` | 异步加载开始(可取消) |
| `OptionsLoaded` | `EventHandler<SelectOptionsLoadedEventArgs>` | 异步加载完成 |
---
## 公共方法
| 方法名 | 返回值 | 说明 |
|---|---|---|
| `ClearValue()` | `void` | 清空所有已选值(`SelectedOption` 和 `SelectedOptions`) |
---
## 伪类(Pseudo-Classes)
| 伪类 | 常量 | 触发条件 |
|---|---|---|
| `:dropdownopen` | `SelectPseudoClass.DropdownOpen` | 下拉面板处于打开状态 |
| `:error` | `StdPseudoClass.Error` | `Status == InputControlStatus.Error` |
| `:warning` | `StdPseudoClass.Warning` | `Status == InputControlStatus.Warning` |
| `:outline` | `AddOnDecoratedBoxPseudoClass.Outline` | `StyleVariant == Outline` |
| `:filled` | `AddOnDecoratedBoxPseudoClass.Filled` | `StyleVariant == Filled` |
| `:borderless` | `AddOnDecoratedBoxPseudoClass.Borderless` | `StyleVariant == Borderless` |
### 继承的标准伪类
| 伪类 | 触发条件 |
|---|---|
| `:pointerover` | 鼠标悬浮 |
| `:pressed` | 控件按下 |
| `:disabled` | `IsEnabled == false` |
| `:focus` | 获得焦点 |
---
## 实现的接口
### ISizeTypeAware
```csharp
public SizeType SizeType { get; set; }
```
### IMotionAwareControl
```csharp
public bool IsMotionEnabled { get; set; }
```
### IInputControlStatusAware
```csharp
public InputControlStatus Status { get; set; }
```
### IInputControlStyleVariantAware
```csharp
public InputControlStyleVariant StyleVariant { get; set; }
```
### ICompactSpaceAware
在 `Space.Compact` 容器中使用时自动调整圆角和边框。根据在紧凑空间中的位置自动裁剪圆角。
### IFormItemAware
可作为 `FormItem` 的子控件参与表单验证流程。支持 `SetFormValue` / `GetFormValue` / `ClearFormValue` / `NotifyValidateStatus`。
### IFormItemFeedbackAware
接收表单验证反馈控件(如错误图标、警告图标),并在 `SelectHandle` 区域展示。
---
## 静态字段
| 字段名 | 类型 | 说明 |
|---|---|---|
| `HeaderFilterPropertySelector` | `DefaultFilterValueSelector` | 按 `Header` 属性过滤的默认提取函数 |
| `ValueFilterPropertySelector` | `DefaultFilterValueSelector` | 按 `Content` 属性过滤的提取函数 |