如何在WPF拖放过程中更新拖动装饰器的位置?

Ian*_*anR 3 wpf drag-and-drop adorner

我正在使用一个装饰来展示被拖动元素的"幽灵"......

var adornerLayer = AdornerLayer.GetAdornerLayer(topLevelGrid);
dragAdorner = new DragAdorner(topLevelGrid, itemToDrag);
adornerLayer.Add(dragAdorner);
dragAdorner.UpdatePosition(e.GetPosition(topLevelGrid));

DragDrop.DoDragDrop(sourceItems, viewModel, DragDropEffects.Move);

adornerLayer.Remove(dragAdorner);
itemToDrag = null;
Run Code Online (Sandbox Code Playgroud)

...但是在拖动过程中我无法找到更新装饰者位置的好方法.我最接近的是设置AllowDrop="true"顶级网格并给它一个DragOver处理程序......

private void TopLevelGrid_OnDragOver(object sender, DragEventArgs e)
{
 dragAdorner.UpdatePosition(e.GetPosition(topLevelGrid));
}
Run Code Online (Sandbox Code Playgroud)

但这意味着我没有得到DragDropEffects关于光标的正确反馈,即它总是显示DragDropEffects.Move光标而不是DragDropEffects.None直到我超过实际的放置目标.

有谁知道更新装饰位置的更好方法?

Mar*_*ter 6

这个(不幸的是只作为缓存版本提供)来自Bea Stollnitz的相当古老的博客文章,它几乎涵盖了你的问题.它有一个很好的拖放实现,一个装饰显示"鬼图像".

基本上拖放WPF是一个非常复杂的过程 - 如果你想要一些自定义DragAdorners - 涉及添加一堆附加的依赖属性来处理所涉及的所有事件的设置,特别是以不干扰的方式显示装饰器删除代码.

Bea的代码通过一个辅助类来设置拥有Window者的DragOver事件处理程序,AllowDrop就在实际的拖放操作之前,这样你就可以控制实际拖动源和放置目标之间的所有移动.