2010-09-14 2 views
7

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

Я использую интерфейс IDataObject, но моя проблема в том, что метод GetData() запрошен слишком рано. Например, перетаскивание по рабочему столу (без какого-либо снижения) запросит метод GetData() пару раз. И каждый из этих звонков начинает загрузку файла:/

Теперь, мой вопрос: что здесь не так - почему метод GetData() называется без капли? Есть ли другой способ реализовать ленивое перетаскивание & операции удаления в .net?

+0

Проблема, с которой вы столкнулись, - это прослушивание события переадресации в проводнике, которое вы хотите инициировать загрузку. Вы можете доказать это, перетащив на другой элемент управления в своей форме, который вы сможете подписаться на событие drop. –

+0

Да, это может мне помочь, но это звучит намного сложнее и связывает мое падение только с исследователем. Другие таргетинты, которые обычно принимают filedrops, не смогут получить данные. Теоретически событие drop должно вызывать * IDataObject.GetData() * - и только он должен это делать. Затем я могу доставить данные (прямое или через скачивание). Однако есть призывы к этим функциям без участия drop, что делает этот подход непригодным. – tanascius

+0

Нет ли способа отложить загрузку до тех пор, пока принимающая сторона не попросит вас увидеть байты? – 2010-09-14 20:38:42

ответ

1

Может быть, это может работать для вас ...

На каждом наступлении GetData() это сделать:

  • вам нужен какой-то таймер здесь.
  • Если ваш таймер уже активен, убейте его.
  • Создайте и запустите новый таймер. Сделайте его 1сек или определите его продолжительность в эксперименте.
  • по событию таймера делать то, что нужно сделать.

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

+0

Проблема в том, что перетащить можно вообще отменить. – tanascius

+0

Вы хотите сказать, что вы не можете сделать различие между завершенным перетаскиванием и отменой одного? –

+0

Да, как вы прерываете свой таймер в случае прерванного перетаскивания? – tanascius

1

Я думаю, что GetData вызывается так, что цель (потенциальная) отбрасывания может определить, может ли он принять (потенциальный) элемент (-ы) падения. Рассматривали ли вы использование расширения оболочки?

+0

Насколько я понимаю [GetDataPresent] (http://msdn.microsoft.com/en- us/library/f0z723wb.aspx) сначала следует вызвать метод. Все еще пытаюсь ... – tanascius

Смежные вопросы