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
我有一个 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