Primary APIs:
TopLevel.GetTopLevel(...)TopLevel.ClipboardIClipboardClipboardExtensionsIDataTransfer, IAsyncDataTransferDataTransfer, DataTransferItemDataFormatImportant members:
IClipboard.ClearAsync(), SetDataAsync(...), TryGetDataAsync()IClipboard.FlushAsync()ClipboardExtensions.SetTextAsync(...), TryGetTextAsync()ClipboardExtensions.SetFileAsync(...), TryGetFileAsync(), TryGetFilesAsync()ClipboardExtensions.SetBitmapAsync(...), TryGetBitmapAsync()DataTransfer.Add(...)DataTransferItem.CreateText(...), CreateFile(...), Set(...), SetText(...), SetFile(...)Reference source files:
src/Avalonia.Controls/TopLevel.cssrc/Avalonia.Base/Input/Platform/IClipboard.cssrc/Avalonia.Base/Input/Platform/ClipboardExtensions.cssrc/Avalonia.Base/Input/IDataTransfer.cssrc/Avalonia.Base/Input/IAsyncDataTransfer.cssrc/Avalonia.Base/Input/DataTransfer.cssrc/Avalonia.Base/Input/DataTransferItem.csAccess pattern:
TopLevel from active visual.topLevel.Clipboard for null.TryGetDataAsync() when required.using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Input.Platform;
public static class ClipboardWorkflows
{
public static async Task CopyTextAsync(Control anchor, string text)
{
TopLevel? top = TopLevel.GetTopLevel(anchor);
if (top?.Clipboard is { } clipboard)
await clipboard.SetTextAsync(text);
}
public static async Task<string?> PasteTextAsync(Control anchor)
{
TopLevel? top = TopLevel.GetTopLevel(anchor);
if (top?.Clipboard is not { } clipboard)
return null;
return await clipboard.TryGetTextAsync();
}
}
Use DataTransfer for multi-format payloads:
using Avalonia.Input;
using Avalonia.Platform.Storage;
public static class DataTransferFactory
{
public static DataTransfer CreateTextAndFilePayload(string text, IStorageItem file)
{
DataTransfer transfer = new();
DataTransferItem item = DataTransferItem.CreateText(text);
item.SetFile(file);
transfer.Add(item);
return transfer;
}
}
Default mode:
XAML-first complete example:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:MyApp.ViewModels"
x:DataType="vm:ClipboardViewModel">
<StackPanel Margin="12" Spacing="8">
<TextBox Text="{CompiledBinding InputText, Mode=TwoWay}" />
<StackPanel Orientation="Horizontal" Spacing="8">
<Button Content="Copy" Command="{CompiledBinding CopyCommand}" />
<Button Content="Paste" Command="{CompiledBinding PasteCommand}" />
</StackPanel>
<TextBlock Text="{CompiledBinding LastPaste}" />
</StackPanel>
</UserControl>
Code-only alternative (on request):
using System.Threading.Tasks;
using Avalonia.Controls;
using Avalonia.Input.Platform;
public static class CodeOnlyClipboardSample
{
public static async Task RoundTripAsync(Control anchor)
{
TopLevel? top = TopLevel.GetTopLevel(anchor);
if (top?.Clipboard is not { } clipboard)
return;
await clipboard.SetTextAsync("clipboard sample");
string? value = await clipboard.TryGetTextAsync();
// Use value in viewmodel/service flow.
_ = value;
}
}
ClipboardExtensions over raw format probing.TryGetTextAsync() returns null:
TryGetInProcessDataAsync() has platform-specific support.TryGetDataAsync() are disposed promptly.