【发布时间】:2015-11-06 17:31:30
【问题描述】:
我有一个 WPF 数据网格,用户可以在其中拖放各种行以重新排序。但是,我需要一个指示器来显示插入行的位置。
我尝试了各种“hacky”方法,包括检测鼠标移动事件和在鼠标所在的位置插入一个空白指示器行。不幸的是,似乎在拖动行时,我的鼠标移动事件都没有被触发。
【问题讨论】:
标签: c# wpf datagrid drag-and-drop
我有一个 WPF 数据网格,用户可以在其中拖放各种行以重新排序。但是,我需要一个指示器来显示插入行的位置。
我尝试了各种“hacky”方法,包括检测鼠标移动事件和在鼠标所在的位置插入一个空白指示器行。不幸的是,似乎在拖动行时,我的鼠标移动事件都没有被触发。
【问题讨论】:
标签: c# wpf datagrid drag-and-drop
UIElement 类提供了几个可以使用的事件。 它们是:
前两个是你可以使用的。
<DataGrid DragOver="MyGrid_DragOver"
DragEnter="MyGrid_DragEnter"
我必须同时使用这两者才能让我的拖放工作。
我通过对 move mouve 事件做出反应来开始拖动操作:
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
【讨论】: