Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 获取DoDragDrop DragSource_Wpf_Drag And Drop - Fatal编程技术网

Wpf 获取DoDragDrop DragSource

Wpf 获取DoDragDrop DragSource,wpf,drag-and-drop,Wpf,Drag And Drop,WPFDragDrop.DoDragDrop方法的第一个参数是DragSource 有什么方法可以在OnDrop或其他拖放事件中获取此DragSource对象吗?简短的回答是否定的,因为当您收到拖动事件(或DragEnter等)时,拖动源对象可能在任何地方。它可能在另一个过程中。它可以是本机代码。如果类似RDP的协议足够复杂,可以处理它,那么它甚至可以在另一台机器上。换句话说,不能保证托管DoDragDrop被调用,如果是,也不能保证它是从这个过程调用的 但是如果您正在编写调用DoDragDro

WPF
DragDrop.DoDragDrop
方法的第一个参数是
DragSource


有什么方法可以在
OnDrop
或其他拖放事件中获取此
DragSource
对象吗?

简短的回答是否定的,因为当您收到拖动事件(或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

,因为简短的回答是“否”,那么dragSource参数对DragDrop.DoDragDrop的作用是什么?如何使用它?