Метод WPF DragDrop.DoDragDrop
имеет DragSource
в качестве своего первого параметра.
Есть ли способ получить этот объект DragSource
в OnDrop
или других событиях перетаскивания?
Метод WPF DragDrop.DoDragDrop
имеет DragSource
в качестве своего первого параметра.
Есть ли способ получить этот объект DragSource
в OnDrop
или других событиях перетаскивания?
Короткий ответ - нет, потому что когда вы получаете событие 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