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.GetTo
pLevel(this)?.Clipboard 是最常用方式,this 需为控件(如 Button、TextBox)IWindowingPlatform 获取 TopLevel,再取 ClipboardIClipboard?,务必判空,尤其在未附加到可视化树时可能为 null这是最常见场景,API 简洁直观:
await clipboard.SetTextAsync("Hello")
string? text = await clipboard.GetTextAsync()
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"),避免冲突