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