Files
AtomUI/docs/Desktop.Controls/Upload/UploadAPI.md
T
chinboy 5a4d62674c docs: add complete Upload control design documentation
- Upload.md: design intent, Ant Design alignment, architecture, template structure
- UploadAPI.md: full API reference (properties, events, enums, shared types)
- UploadUsage.md: usage guide with AXAML/C# examples from Gallery showcase
- UploadStyling.md: custom styling guide with selector reference
- UploadToken.md: component token reference with SharedToken derivation chain
2026-04-14 10:53:39 +08:00

316 lines
11 KiB
Markdown
Raw 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.
# Upload API 参考
## 命名空间
```csharp
namespace AtomUI.Desktop.Controls;
```
AXAML 命名空间前缀:`atom`(`xmlns:atom="https://atomui.net"`)
---
## 枚举类型
### UploadListType
上传列表展示类型枚举,控制文件列表的外观和布局。
| 值 | 说明 |
|---|---|
| `Text` | 文本列表,仅显示文件名、进度条和操作按钮 |
| `Picture` | 图片列表,在文本列表基础上增加缩略图预览 |
| `PictureCard` | 图片卡片墙,以卡片网格形式展示,触发按钮嵌入网格中 |
| `PictureCircle` | 圆形图片墙,与 PictureCard 类似但使用圆形展示 |
### UploadPredicateResult
上传拦截结果枚举,用于 `UploadTaskAboutToScheduling` 事件中控制上传行为。
| 值 | 说明 |
|---|---|
| `Schedule` | 正常调度上传(默认值) |
| `Cancel` | 取消上传,文件不显示在列表中(对标 Ant Design `LIST_IGNORE`) |
| `CancelWithInTaskList` | 取消上传,但文件显示在列表中并标记为失败 |
### FileUploadStatus(来自 `AtomUI.Controls`)
文件上传状态枚举,定义于设备无关层 `AtomUI.Controls.Shared`。
| 值 | 说明 |
|---|---|
| `Pending` | 等待调度 |
| `Uploading` | 上传中 |
| `Success` | 上传成功 |
| `Failed` | 上传失败 |
| `Cancelled` | 已取消 |
### FileUploadErrorCode(来自 `AtomUI.Controls`)
文件上传错误码枚举,定义于设备无关层 `AtomUI.Controls.Shared`。
| 值 | 说明 |
|---|---|
| `None` | 无错误 |
| `NetworkError` | 网络连接/超时问题 |
| `ServerError` | 服务器 5xx 错误 |
| `ClientError` | 服务器 4xx 错误(如认证失败、参数错误) |
| `FileError` | 本地文件错误(找不到、无权限) |
| `ValidationFailed` | 验证失败(如文件类型、大小不符) |
| `Cancelled` | 操作被取消 |
| `Unknown` | 未知错误 |
---
## Upload 公共属性
### StyledProperty
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Accepts` | `IReadOnlyList<string>?` | `null` | 文件类型过滤列表,支持模式匹配(如 `*.png`、`*.jpg`),应用于文件选择对话框 |
| `ExtraContext` | `object?` | `null` | 附加上下文对象,随上传任务传递到 `IFileUploadTransport.UploadAsync` 的 `context` 参数 |
| `MaxCount` | `int` | `int.MaxValue` | 最大文件数量限制。`1` 时新文件替换旧文件,`>1` 时达上限后忽略新文件 |
| `IsUploadDirectoryEnabled` | `bool` | `false` | 是否启用目录上传模式(弹出文件夹选择对话框) |
| `ListType` | `UploadListType` | `UploadListType.Text` | 文件列表展示类型 |
| `IsMultipleEnabled` | `bool` | `false` | 是否允许多选文件 |
| `IsOpenFileDialogOnClick` | `bool` | `true` | 点击触发区时是否打开文件选择对话框 |
| `IsShowUploadList` | `bool` | `true` | 是否显示文件列表 |
| `IsShowUploadTrigger` | `bool` | `true` | 是否显示上传触发区 |
| `DefaultTaskList` | `IList<UploadTaskInfo>?` | `null` | 默认文件列表,页面初始化时展示已有文件 |
| `MaxConcurrentTasks` | `int` | `3` | 最大并发上传任务数 |
| `IsMotionEnabled` | `bool` | 跟随全局 Token | 是否启用过渡动画(共享属性,通过 `AddOwner` 注册) |
### DirectProperty
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `UploadTransport` | `IFileUploadTransport?` | `null` | 上传传输实现,未设置时文件选择后不会启动上传 |
| `IsTaskRunning` | `bool` | `false` | 只读,是否有上传任务正在运行 |
### 公共集合属性
| 属性名 | 类型 | 说明 |
|---|---|---|
| `TaskInfoList` | `AvaloniaList<UploadTaskInfo>` | 当前文件列表(可观察集合),包含所有上传任务的信息 |
### 公共回调
| 属性名 | 类型 | 说明 |
|---|---|---|
| `IsImageFilePredicate` | `Func<UploadFileInfo, bool>?` | 自定义图片文件判断回调。未设置时使用内置的扩展名匹配(支持 `.webp`、`.svg`、`.png`、`.gif`、`.jpg` 等 12 种格式) |
### 继承自 ContentControl 的常用属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Content` | `object?` | `null` | 上传触发区内容(如 `Button`、`UploadDefaultDropArea`) |
| `ContentTemplate` | `IDataTemplate?` | `null` | 内容模板 |
| `HorizontalContentAlignment` | `HorizontalAlignment` | `Left` | 触发区内容水平对齐 |
| `VerticalContentAlignment` | `VerticalAlignment` | `Center` | 触发区内容垂直对齐 |
| `IsEnabled` | `bool` | `true` | 是否启用 |
---
## Upload 公共方法
| 方法名 | 返回类型 | 说明 |
|---|---|---|
| `ResetAsync()` | `Task` | 异步重置控件:取消所有正在进行的上传任务并清空文件列表 |
| `Reset()` | `void` | 同步版重置,内部调度到 UI 线程异步执行取消操作 |
---
## Upload 事件
| 事件名 | 事件参数类型 | 说明 |
|---|---|---|
| `UploadTaskCreated` | `UploadTaskCreatedEventArgs` | 文件选择后、上传任务创建时触发 |
| `UploadTaskAboutToScheduling` | `UploadTaskAboutToSchedulingEventArgs` | 任务即将调度上传前触发,可通过设置 `Result` 属性拦截上传 |
| `UploadTaskProgress` | `UploadTaskProgressEventArgs` | 上传进度更新时触发 |
| `UploadTaskCompleted` | `UploadTaskCompletedEventArgs` | 上传成功完成时触发 |
| `UploadTaskFailed` | `UploadTaskFailedEventArgs` | 上传失败时触发 |
| `UploadTaskCancelled` | `UploadTaskCancelledEventArgs` | 上传被取消时触发 |
| `UploadTaskRemoved` | `UploadTaskRemovedEventArgs` | 文件从列表中移除时触发 |
### 事件参数详情
#### UploadTaskCreatedEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
#### UploadTaskAboutToSchedulingEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
| `Result` | `UploadPredicateResult` | 可设置的拦截结果(默认 `Schedule`) |
| `CancelReason` | `string?` | 取消原因说明(设置 `Result` 为取消时使用) |
#### UploadTaskProgressEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
| `Progress` | `double` | 上传进度百分比(0~100) |
#### UploadTaskCompletedEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
| `Result` | `FileUploadResult` | 上传结果(包含远端 URL、文件 ID 等信息) |
#### UploadTaskFailedEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
| `Result` | `FileUploadResult` | 失败结果(包含错误码和错误消息) |
#### UploadTaskCancelledEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
| `Result` | `FileUploadResult` | 取消结果 |
#### UploadTaskRemovedEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `UploadFileInfo` | `UploadFileInfo` | 上传文件信息 |
---
## UploadTaskInfo 属性
`UploadTaskInfo` 继承自 `AvaloniaObject`,表示文件列表中每个上传任务的信息。
| 属性名 | 类型 | 说明 |
|---|---|---|
| `TaskId` | `Guid` | 上传任务唯一标识 |
| `FileName` | `string?` | 文件名 |
| `Progress` | `double` | 上传进度(0~100) |
| `IsImageFile` | `bool` | 是否为图片文件 |
| `Status` | `FileUploadStatus` | 上传状态 |
| `ErrorMessage` | `string?` | 错误消息(失败时使用) |
| `FilePath` | `Uri?` | 文件路径(本地路径或 `avares://` 资源路径) |
---
## UploadDefaultDropArea 公共属性
`UploadDefaultDropArea` 是公共拖拽上传区域控件,可作为 `Upload.Content` 使用。
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `DropIcon` | `PathIcon?` | `InboxOutlined` | 拖拽区域图标 |
| `Header` | `object?` | 本地化字符串 `DragUploadHead` | 拖拽区域主标题 |
| `HeaderTemplate` | `IDataTemplate?` | `null` | 主标题模板 |
| `SubHeader` | `object?` | `null` | 拖拽区域副标题 |
| `SubHeaderTemplate` | `IDataTemplate?` | `null` | 副标题模板 |
| `IsMotionEnabled` | `bool` | 跟随全局 Token | 是否启用过渡动画 |
### UploadDefaultDropArea 事件
| 事件名 | 事件参数类型 | 说明 |
|---|---|---|
| `FilesDropped` | `UploadFilesDroppedEventArgs` | 文件拖放到区域时触发(冒泡路由事件) |
#### UploadFilesDroppedEventArgs
| 属性 | 类型 | 说明 |
|---|---|---|
| `Files` | `IReadOnlyList<IStorageFile>` | 被拖放的文件列表 |
---
## 设备无关层类型(AtomUI.Controls.Shared)
### IFileUploadTransport 接口
```csharp
namespace AtomUI.Controls;
public interface IFileUploadTransport
{
Task<FileUploadResult> UploadAsync(
UploadFileInfo fileInfo,
object? context = null,
IProgress<FileUploadProgress>? progress = null,
CancellationToken cancellationToken = default);
}
```
### UploadFileInfo record
| 属性 | 类型 | 说明 |
|---|---|---|
| `Name` | `string` | 文件名 |
| `FilePath` | `Uri` | 文件路径 |
| `Size` | `long` | 文件大小(字节) |
| `DateCreated` | `DateTimeOffset?` | 文件创建时间 |
| `DateModified` | `DateTimeOffset?` | 文件修改时间 |
### FileUploadProgress record
| 属性 | 类型 | 说明 |
|---|---|---|
| `BytesSent` | `long` | 已发送字节数 |
| `TotalBytes` | `long` | 总字节数 |
| `Percentage` | `double` | 进度百分比(只读,自动计算) |
### FileUploadResult record
| 属性 | 类型 | 说明 |
|---|---|---|
| `Status` | `FileUploadStatus` | 上传最终状态 |
| `IsSuccess` | `bool` | 是否成功(只读便捷属性) |
| `ErrorCode` | `FileUploadErrorCode` | 分类错误码 |
| `UserFriendlyMessage` | `string?` | 用户友好的错误消息 |
| `InternalErrorMessage` | `string?` | 内部错误信息(用于调试) |
| `Exception` | `Exception?` | 关联的异常 |
| `RemoteUrl` | `Uri?` | 文件在服务器上的访问地址 |
| `FileId` | `string?` | 服务器返回的文件标识 |
| `FileHash` | `string?` | ETag 或文件哈希 |
| `FileSize` | `long` | 文件大小(字节) |
| `ElapsedTime` | `TimeSpan` | 上传耗时 |
| `AverageSpeed` | `double` | 平均上传速度(字节/秒,只读) |
| `Metadata` | `Dictionary<string, object>?` | 服务器返回的自定义元数据 |
**静态工厂方法:**
| 方法 | 说明 |
|---|---|
| `SuccessResult(remoteUrl, fileSize, elapsedTime, ...)` | 创建成功结果 |
| `FailureResult(errorCode, userFriendlyMessage, ...)` | 创建失败结果 |
| `CancelledResult(userFriendlyMessage)` | 创建取消结果 |
---
## 实现的接口
### IMotionAwareControl
```csharp
public bool IsMotionEnabled { get; set; }
```
控制 Upload 及其子组件的过渡动画开关。
### IFormItemAware
可作为 `FormItem` 的子控件参与表单验证流程。提供 `ValueChanged` 事件、`SetFormValue` / `GetFormValue` / `ClearFormValue` 方法。
> 注意:Upload 的表单值定义目前尚在开发中(源码中标注 TODO)。