Rac*_*hel 13 wpf drag-and-drop
我在Canvas上有一个拖放操作,当一个对象被拖入和拖出时,它应该做某事.我的问题是DragEnter/DragLeave事件在鼠标移动对象时继续触发,而不仅仅是在进入/退出时.鼠标移动得越快,事件发生的频率就越高.
Canvas DragOver事件移动了DraggedObject的Canvas.Top/Left,我认为这可能是我的问题,但我不知道如何解决这个问题.
Ray*_*rns 17
以下是事件序列:
DragEnter事件在画布上触发.DragEnter处理程序移动Panel,使其现在位于鼠标下方.由于鼠标不再位于Canvas上(它位于Panel上方),因此DragLeave事件将触发.移动鼠标的速度越快,您收到的事件就越多.
你的问题的本质是拖放使用命中测试,并且通过移动你的面板,你正在击败命中测试的能力,看看你的面板"后面"知道它被丢弃的容器.
解决方案是使用您自己的代码进行拖放处理,这实际上并不困难.WPF的命中测试引擎足够强大,可以在当前对象后面进行命中测试,但拖放功能不会使用此功能.你可以直接使用它,但是使用VisualTreeHelper.HitTest带a HitTestFilterCallback和a 的重载HitTestResultCallback.只需传递一个过滤器,忽略被拖动面板内的任何命中.
我发现对于你描述的场景,通过处理鼠标事件进行拖放实际上比使用内置的DoDragDrop更容易,因为你不必处理复杂性(DataObject,DragDropEffects,QueryContinueDrag等).这种额外的复杂性对于启用应用程序和进程之间的拖动方案非常重要,但对您正在执行的操作没有帮助.
这是简单的解决方案:
请享用.
| 归档时间: |
|
| 查看次数: |
14143 次 |
| 最近记录: |