diff --git a/src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs b/src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs index 8460268ec6..6fe64134d8 100644 --- a/src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs +++ b/src/Avalonia.Base/Input/Platform/DataObjectToDataTransferWrapper.cs @@ -28,6 +28,7 @@ internal sealed class DataObjectToDataTransferWrapper(IDataObject dataObject) var items = new List(); var nonFileFormats = new List(); var nonFileFormatStrings = new List(); + var hasFiles = false; foreach (var formatString in DataObject.GetDataFormats()) { @@ -35,18 +36,28 @@ internal sealed class DataObjectToDataTransferWrapper(IDataObject dataObject) if (formatString == DataFormats.Files) { + if (hasFiles) + continue; + // This is not ideal as we're reading the filenames ahead of time to generate the appropriate items. // We don't really care about that for this legacy wrapper. if (DataObject.Get(formatString) is IEnumerable storageItems) { + hasFiles = true; + foreach (var storageItem in storageItems) items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem)); } } else if (formatString == DataFormats.FileNames) { + if (hasFiles) + continue; + if (DataObject.Get(formatString) is IEnumerable fileNames) { + hasFiles = true; + foreach (var fileName in fileNames) { if (StorageProviderHelpers.TryCreateBclStorageItem(fileName) is { } storageItem) diff --git a/src/Avalonia.X11/Clipboard/X11Clipboard.cs b/src/Avalonia.X11/Clipboard/X11Clipboard.cs index 21ba3d54f7..a5a56a51d7 100644 --- a/src/Avalonia.X11/Clipboard/X11Clipboard.cs +++ b/src/Avalonia.X11/Clipboard/X11Clipboard.cs @@ -327,15 +327,21 @@ namespace Avalonia.X11.Clipboard { List? nonFileFormats = null; var items = new List(); + var hasFiles = false; foreach (var format in formats) { if (DataFormat.File.Equals(format)) { + if (hasFiles) + continue; + // We're reading the filenames ahead of time to generate the appropriate items. // This is async, so it should be fine. if (await reader.TryGetAsync(format) is IEnumerable storageItems) { + hasFiles = true; + foreach (var storageItem in storageItems) items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem)); } diff --git a/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs b/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs index 820231d16d..1e521e685c 100644 --- a/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs +++ b/src/Windows/Avalonia.Win32/OleDataObjectHelper.cs @@ -29,15 +29,15 @@ internal static class OleDataObjectHelper tymed = TYMED.TYMED_HGLOBAL }; - public static unsafe object? TryGet(this Win32Com.IDataObject _oleDataObject, DataFormat format) + public static unsafe object? TryGet(this Win32Com.IDataObject oleDataObject, DataFormat format) { var formatEtc = format.ToFormatEtc(); - if (_oleDataObject.QueryGetData(&formatEtc) != (uint)HRESULT.S_OK) + if (oleDataObject.QueryGetData(&formatEtc) != (uint)HRESULT.S_OK) return null; var medium = new STGMEDIUM(); - if (_oleDataObject.GetData(&formatEtc, &medium) != (uint)HRESULT.S_OK) + if (oleDataObject.GetData(&formatEtc, &medium) != (uint)HRESULT.S_OK) return null; try diff --git a/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs b/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs index 8afc079d20..f5e101e0d0 100644 --- a/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs +++ b/src/Windows/Avalonia.Win32/OleDataObjectToDataTransferWrapper.cs @@ -54,15 +54,21 @@ internal sealed class OleDataObjectToDataTransferWrapper(Win32Com.IDataObject ol { List? nonFileFormats = null; var items = new List(); + var hasFiles = false; foreach (var format in Formats) { if (DataFormat.File.Equals(format)) { + if (hasFiles) + continue; + // This is not ideal as we're reading the filenames ahead of time to generate the appropriate items. // However, it's unlikely to be a heavy operation. if (_oleDataObject.TryGet(format) is IEnumerable storageItems) { + hasFiles = true; + foreach (var storageItem in storageItems) items.Add(PlatformDataTransferItem.Create(DataFormat.File, storageItem)); }