wpf - 如何在 WPF 拖放期间更新拖动装饰器的位置?

标签 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;

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

private void TopLevelGrid_OnDragOver(object sender, DragEventArgs e)
{
 dragAdorner.UpdatePosition(e.GetPosition(topLevelGrid));
}

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

有人知道更新装饰器位置的更好方法吗?

最佳答案

this (不幸的是,只能作为缓存版本提供)来自 Bea Stollnitz 的相当古老的博客文章,它几乎涵盖了您的问题。它有一个很好的拖放实现,带有一个显示“幽灵图像”的装饰器。

基本上,WPF 中的拖放是一个相当复杂的过程——如果你想要一些自定义 DragAdorners——涉及添加一堆附加的依赖属性来处理所有涉及的事件的设置,特别是用于以不显示装饰器的方式'不干扰丢弃代码。

Bea 的代码通过一个帮助类来工作,该类在实际拖放之前设置拥有 WindowDragOver 事件处理程序和 AllowDrop操作,这样您就可以控制实际拖动源和放置目标之间的所有移动。

关于wpf - 如何在 WPF 拖放期间更新拖动装饰器的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2094448/

相关文章:

c# - 为什么我的 Command.CanExecute 在单元测试中总是返回 false?

c# - 获取 ComboBox 的 SelectedItem (MVVM)

javascript - 拖动时拖放更改图像

c# - WPF TreeView 中的 "Link"项

wpf - 无法在没有装饰者的元素上访问装饰者

wpf - 如何确保装饰层中的验证显示在其他控件后面

wpf - 在 wpf 中将图像放入 ViewPort3D

c# - 强制 drawingContext 线捕捉到像素边界

带有部分 preventDefault 的 javascript 拖放

javascript - jQuery 拖放多个元素