Не уверен, как это сделать в .NET, но в обычном программировании на Win32 объект, реализующий интерфейс IDataObject, может также дополнительно реализовать интерфейс IAsyncOperation. Затем IDropTarget может использовать этот интерфейс для выполнения перетаскивания в фоновом потоке, чтобы источник и цель не блокировались во время фактической передачи. Единственный недостаток в том, что цель, а не источник, решает, воспользоваться этим преимуществом или нет.
Альтернативой является использование передачи "оптимизированного перемещения", когда IDataObject предоставляет имена файлов, а IDropTarget перемещает файлы напрямую.
В MSDN есть подробности: Обработка сценариев передачи данных в оболочке .
Конечно, это все еще означает, что вы должны загрузить файлы перед началом перетаскивания. На самом деле нет способа выполнить перетаскивание, чтобы определить цель, а затем выполнить загрузку впоследствии. Однако вы можете сделать так, чтобы IDataObject содержал записи CFSTR_FILEDESCRIPTOR
и CFSTR_FILECONTENTS
(описанные здесь: Форматы буфера обмена Shell ), где CFSTR_FILEDESCRIPTOR
заполняется информацией, которую вы использовали для заполнения ListView, а CFSTR_FILECONTENTS
использует интерфейсы IStream, реализации которых выполняют загрузку во время фактической операции удаления, а не до нее. По крайней мере, таким образом, вы загружаете только те файлы, которые действительно нужны цели, и можете пропустить остальные.
Соедините это с IAsyncOperation, и это может дать вам конечный эффект, который вы ищете.