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