diff --git a/src/Avalonia.Base/Input/AsyncDataTransferExtensions.cs b/src/Avalonia.Base/Input/AsyncDataTransferExtensions.cs
index cf9d320310..a71a1e744d 100644
--- a/src/Avalonia.Base/Input/AsyncDataTransferExtensions.cs
+++ b/src/Avalonia.Base/Input/AsyncDataTransferExtensions.cs
@@ -27,6 +27,9 @@ public static class AsyncDataTransferExtensions
return new AsyncToSyncDataTransfer(asyncDataTransfer);
}
+ internal static IAsyncDataTransfer ToAsynchronous(this IDataTransfer dataTransfer)
+ => dataTransfer as IAsyncDataTransfer ?? new SyncToAsyncDataTransfer(dataTransfer);
+
///
/// Gets whether a supports a specific format.
///
diff --git a/src/Avalonia.Base/Input/SyncToAsyncDataTransfer.cs b/src/Avalonia.Base/Input/SyncToAsyncDataTransfer.cs
new file mode 100644
index 0000000000..c228e8b8db
--- /dev/null
+++ b/src/Avalonia.Base/Input/SyncToAsyncDataTransfer.cs
@@ -0,0 +1,43 @@
+using System.Collections.Generic;
+
+namespace Avalonia.Input;
+
+///
+/// Wraps a into a .
+///
+/// The sync object to wrap.
+internal sealed class SyncToAsyncDataTransfer(IDataTransfer dataTransfer)
+ : IDataTransfer, IAsyncDataTransfer
+{
+ private SyncToAsyncDataTransferItem[]? _items;
+
+ public IReadOnlyList Formats
+ => dataTransfer.Formats;
+
+ public IReadOnlyList Items
+ => _items ??= ProvideItems();
+
+ IReadOnlyList IDataTransfer.Items
+ => dataTransfer.Items;
+
+ IReadOnlyList IAsyncDataTransfer.Items
+ => Items;
+
+ private SyncToAsyncDataTransferItem[] ProvideItems()
+ {
+ var asyncItems = dataTransfer.Items;
+ var count = asyncItems.Count;
+ var syncItems = new SyncToAsyncDataTransferItem[count];
+
+ for (var i = 0; i < count; ++i)
+ {
+ var asyncItem = asyncItems[i];
+ syncItems[i] = new SyncToAsyncDataTransferItem(asyncItem);
+ }
+
+ return syncItems;
+ }
+
+ public void Dispose()
+ => dataTransfer.Dispose();
+}
diff --git a/src/Avalonia.Base/Input/SyncToAsyncDataTransferItem.cs b/src/Avalonia.Base/Input/SyncToAsyncDataTransferItem.cs
new file mode 100644
index 0000000000..705ce0bdee
--- /dev/null
+++ b/src/Avalonia.Base/Input/SyncToAsyncDataTransferItem.cs
@@ -0,0 +1,21 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+
+namespace Avalonia.Input;
+
+///
+/// Wraps a into a .
+///
+/// The sync item to wrap.
+internal sealed class SyncToAsyncDataTransferItem(IDataTransferItem dataTransferItem)
+ : IDataTransferItem, IAsyncDataTransferItem
+{
+ public IReadOnlyList Formats
+ => dataTransferItem.Formats;
+
+ public object? TryGetRaw(DataFormat format)
+ => dataTransferItem.TryGetRaw(format);
+
+ public Task