WPF 数据网格拖放目标指示器

WPF datagrid drag and drop target indicator

我有一个 WPF 数据网格,用户可以在其中拖放各种行以重新排序。但是,我需要一个指示器来显示行的插入位置。

我尝试了多种 'hacky' 方法,包括检测鼠标移动事件和在鼠标所在的位置插入空白指示符行。不幸的是,似乎在拖动行时,none 的鼠标移动事件被触发了。

UIElement class 提供了几个您可以使用的事件。 它们是:

  • 拖动输入
  • DragOver
  • DragLeave
  • 掉落

前两个是您可以使用的。

<DataGrid DragOver="MyGrid_DragOver"
          DragEnter="MyGrid_DragEnter"

我必须同时使用两者才能使拖放工作正常进行。


我通过响应移动事件来启动拖动操作:

private void MyGrid_MouseMove(object sender, MouseEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {    
        var dragSource = ...;
        var data = ...;
        DragDrop.DoDragDrop(dragSource, data, DragDropEffects.Move);
    }
}


然后在目标控件(您的 DataGrid)上编写事件处理程序的代码:

private void MyGrid_DragOver(object sender, DragEventArgs e)
{
    this.DragOver_DragEnter(sender, e);
}

private void MyGrid_DragEnter(object sender, DragEventArgs e)
{
    this.DragOver_DragEnter(sender, e);
}

然后你可以设置Effects 属性给用户一个视觉反馈:

private void DragOver_DragEnter(object sender, DragEventArgs e)
{
    // code here to decide whether drag target is ok

    e.Effects = DragDropEffects.None;
    e.Effects = DragDropEffects.Move;
    e.Effects = DragDropEffects.Copy;
    e.Handled = true;
    return;
}


也在 MSDN 上查看此回复:Giving drag and drop feedback using DragEventArgs.Effect