获取DoDragDrop DragSource

The*_*ies 16 wpf drag-and-drop

WPF DragDrop.DoDragDrop方法DragSource作为其第一个参数.

有没有办法可以DragSourceOnDrop其他拖放事件中获取此对象?

Ray*_*rns 20

简短的回答是否定的,因为当您收到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);
Run Code Online (Sandbox Code Playgroud)

现在在OnDrag处理程序中,很容易获得拖动源:

protected override void OnDrop(DragEventArgs e)
{
  var data = e.Data.GetData(DataFormats.Text);
  var dragSource = e.Data.GetData("DragSource");
  ...
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,知道源对象本身就足以获得完成拖动操作所需的数据,在这种情况下,上述内容可归结为:

 DragDrop.DoDragDrop(dragSource, dragSource, DragDropEffects.Copy);

 ...

 var dragSource = e.Data.GetData(typeof(MyDragSource));
Run Code Online (Sandbox Code Playgroud)

请注意,在这两种情况下,如果拖动操作的源位于代码之外的其他位置(例如,从Emplorer拖动文件),则会得到dragSource = null

  • 由于简短回答为"否",因此dragDource参数对DragDrop.DoDragDrop的目的是什么?它是如何使用的? (12认同)