2009-11-12 2 views
16

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

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

ответ

19

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

+9

Поскольку короткий ответ «нет», то какова цель параметра dragSource для DragDrop. DoDragDrop? Как он используется? – HappyNomad

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