Avalonia 中操作剪贴板需通过 TopLevel.GetTopLevel(this)?.Clipboard 获取 IClipboard? 实例并判空;支持异步文本复制/粘贴、文件路径拖放(需转 IStorageFile[])、自定义格式二进制数据(推荐 JSON/MessagePack 序列化)。

在 Avalonia 中操作剪贴板,核心是使用 IClipboard 接口,它屏蔽了 Windows/macOS/Linux 底层差异,提供统一、跨平台的异步 API。与 WinForms 的 System.Windows.Forms.Clipboard 不同,Avalonia 的剪贴板必须通过当前 TopLevel(如 Window)获取,且所有操作均为异步。
获取剪贴板实例
不能直接 new 或静态调用,需从窗口上下文提取:
-
TopLevel.GetTopLevel(this)?.Clipboard是最常用方式,this需为控件(如 Button、TextBox) - 若在 ViewModel 中使用,建议通过依赖注入或传入
IWindowingPlatform获取 TopLevel,再取 Clipboard - 返回值为
IClipboard?,务必判空,尤其在未附加到可视化树时可能为 null
文本复制与粘贴
这是最常见场景,API 简洁直观:
- 复制:
await clipboard.SetTextAsync("Hello") - 粘贴:
string? text = await clipboard.GetTextAsync() - 支持 UTF-8、换行符等,无需额外编码处理
- 若需响应粘贴失败(如剪贴板为空或非文本),可配合
ContainsTextAsync()预检
文件拖放与文件列表复制
Avalonia 支持将本地文件路径写入剪贴板,供其他应用(如资源管理器)识别为“文件拖放”源:
- 需构造
DataObject,并用DataFormats.Files格式设置 - 路径需先转为
IStorageFile列表(通过StorageProvider.TryGetFileFromPathAsync) - 示例:复制三个路径 → 转为
IStorageFile[]→dataObject.SetData(DataFormats.Files, files)→clipboard.SetDataObjectAsync(dataObject) - 注意:仅支持本机绝对路径;相对路径或网络路径无效
自定义格式与二进制数据
如需存取图像、序列化对象等,应避免使用已弃用的 BinaryFormatter(.NET 8+ 默认禁用):
- 推荐用
System.Text.Json或MessagePack序列化后转byte[] - 写入:
dataObject.SetData("myapp/json-data", jsonDataBytes) - 读取:
var bytes = await dataObject.TryGetValueAsync("myapp/json-data") - 自定义格式名建议带命名空间前缀(如
"com.example.user-info"),避免冲突










