Получение DoDragDrop DragSource - PullRequest
16 голосов
/ 12 ноября 2009

Метод WPF DragDrop.DoDragDrop имеет DragSource в качестве первого параметра.

Есть ли способ получить этот DragSource объект в OnDrop или других событиях перетаскивания?

1 Ответ

19 голосов
/ 12 ноября 2009

Короткий ответ - нет, потому что при получении события Drag (или DragEnter и т. Д.) Исходный объект перетаскивания может находиться где угодно. Это может быть в другом процессе. Это может быть в нативном коде. Это может быть даже на другой машине, если RDP-подобный протокол достаточно сложен для его обработки. Другими словами, нет никакой гарантии, что управляемый DoDragDrop даже был вызван, и если это было, то нет гарантии, что он был вызван из этого процесса.

НО если вы пишете код, который вызывает DoDragDrop, а также пишете код для OnDrop(), есть простой способ получить этот эффект:

При вызове DoDragDrop добавьте свой объект в качестве дополнительного формата:

 var dragSource = this;
 var data = "Hello";

 var dataObj = new DataObject(data);
 dataObj.SetData("DragSource", dragSource);
 DragDrop.DoDragDrop(dragSource, dataObj, DragDropEffects.Copy);

Теперь в обработчике OnDrag легко получить источник перетаскивания:

protected override void OnDrop(DragEventArgs e)
{
  var data = e.Data.GetData(DataFormats.Text);
  var dragSource = e.Data.GetData("DragSource");
  ...
}

В некоторых случаях знание самого исходного объекта является достаточным для получения данных, необходимых для завершения операции перетаскивания, и в этом случае приведенное выше сводится к:

 DragDrop.DoDragDrop(dragSource, dragSource, DragDropEffects.Copy);

 ...

 var dragSource = e.Data.GetData(typeof(MyDragSource));

Обратите внимание, что в любом из этих случаев, если источником операции перетаскивания является другой, чем ваш код (например, перетаскивание файла из Emplorer), вы получите dragSource = null

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