From 9cb23b0d68f7ce5d0bcf1fd9f5813c7ae07dd90b Mon Sep 17 00:00:00 2001 From: "seer-by-sentry[bot]" <157164994+seer-by-sentry[bot]@users.noreply.github.com> Date: Thu, 31 Jul 2025 19:35:47 +0000 Subject: [PATCH] Refactor: Cache DataTransferManager and items to share --- src/Files.App/Helpers/ShareItemHelpers.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Files.App/Helpers/ShareItemHelpers.cs b/src/Files.App/Helpers/ShareItemHelpers.cs index 564a238ec50f..4eabf538ad13 100644 --- a/src/Files.App/Helpers/ShareItemHelpers.cs +++ b/src/Files.App/Helpers/ShareItemHelpers.cs @@ -11,6 +11,9 @@ namespace Files.App.Helpers { public static class ShareItemHelpers { + private static DataTransferManager _dataTransferManager; + private static IEnumerable _itemsToShare; + public static bool IsItemShareable(ListedItem item) => !item.IsHiddenItem && (!item.IsShortcut || item.IsLinkItem) && @@ -21,14 +24,20 @@ public static async Task ShareItemsAsync(IEnumerable itemsToShare) if (itemsToShare is null) return; - var interop = DataTransferManager.As(); - IntPtr result = interop.GetForWindow(MainWindow.Instance.WindowHandle, Win32PInvoke.DataTransferManagerInteropIID); + _itemsToShare = itemsToShare; - var manager = WinRT.MarshalInterface.FromAbi(result); - manager.DataRequested += new TypedEventHandler(Manager_DataRequested); + if (_dataTransferManager == null) + { + var interop = DataTransferManager.As(); + IntPtr result = interop.GetForWindow(MainWindow.Instance.WindowHandle, Win32PInvoke.DataTransferManagerInteropIID); + _dataTransferManager = WinRT.MarshalInterface.FromAbi(result); + } + _dataTransferManager.DataRequested -= new TypedEventHandler(Manager_DataRequested); + _dataTransferManager.DataRequested += new TypedEventHandler(Manager_DataRequested); try { + var interop = DataTransferManager.As(); interop.ShowShareUIForWindow(MainWindow.Instance.WindowHandle); } catch (Exception ex) @@ -52,7 +61,7 @@ async void Manager_DataRequested(DataTransferManager sender, DataRequestedEventA List items = []; DataRequest dataRequest = args.Request; - foreach (ListedItem item in itemsToShare) + foreach (ListedItem item in _itemsToShare) { if (item is IShortcutItem shItem) {