Подтвердить что ты не робот

Получение DoDragDrop DragSource

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

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

4b9b3361

Ответ 1

Короткий ответ - нет, потому что когда вы получаете событие 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