Выполнить реализацию dragdrop после вызова метода DoDragDrop - PullRequest
4 голосов
/ 24 июня 2009

Я уже давно борюсь с этим

Мое приложение содержит представление списка, заполненное именами файлов, которые расположены на сервере.

Я пытаюсь реализовать функцию перетаскивания, чтобы пользователь мог перетаскивать файлы из моего приложения на свой локальный компьютер.

Для этого сначала я загружаю файлы во временную папку, а затем вызываю метод DoDragDrop () моего приложения.

Проблема в том, что я хочу выполнить процесс загрузки только после , вызывается метод DoDragDrop.

Я пробовал каждое событие, связанное с методами перетаскивания (GiveFeedback, ItemDrag и т. Д.), Но ничего не работает

так что в основном мне нужно событие, вызванное после выполнения DoDragDrop

есть идеи ??

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

Не уверен, как это сделать в .NET, но в обычном программировании на Win32 объект, реализующий интерфейс IDataObject, может также дополнительно реализовать интерфейс IAsyncOperation. Затем IDropTarget может использовать этот интерфейс для выполнения перетаскивания в фоновом потоке, чтобы источник и цель не блокировались во время фактической передачи. Единственный недостаток в том, что цель, а не источник, решает, воспользоваться этим преимуществом или нет.

Альтернативой является использование передачи "оптимизированного перемещения", когда IDataObject предоставляет имена файлов, а IDropTarget перемещает файлы напрямую.

В MSDN есть подробности: Обработка сценариев передачи данных в оболочке .

Конечно, это все еще означает, что вы должны загрузить файлы перед началом перетаскивания. На самом деле нет способа выполнить перетаскивание, чтобы определить цель, а затем выполнить загрузку впоследствии. Однако вы можете сделать так, чтобы IDataObject содержал записи CFSTR_FILEDESCRIPTOR и CFSTR_FILECONTENTS (описанные здесь: Форматы буфера обмена Shell ), где CFSTR_FILEDESCRIPTOR заполняется информацией, которую вы использовали для заполнения ListView, а CFSTR_FILECONTENTS использует интерфейсы IStream, реализации которых выполняют загрузку во время фактической операции удаления, а не до нее. По крайней мере, таким образом, вы загружаете только те файлы, которые действительно нужны цели, и можете пропустить остальные.

Соедините это с IAsyncOperation, и это может дать вам конечный эффект, который вы ищете.

3 голосов
/ 19 июля 2010

Вот пример , который может быть похож на решение Реми ...

0 голосов
/ 24 июня 2009

Вы проверяли событие DragDrop ? Это событие, которое возникло при успешном падении вашего контроля.

Обновление: если вам нужно перетаскивать файлы в проводник с отложенным рендерингом, вы можете прочитать следующую статью (реализация встроенной оболочки drag-n-drop в c #). Используя информацию и код из этой статьи, вы можете создать собственную реализацию IDataObject с поддержкой отложенного рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...