如果拖动目标被其他图形遮挡,WPF 拖放事件不会通过

Posted

技术标签:

【中文标题】如果拖动目标被其他图形遮挡,WPF 拖放事件不会通过【英文标题】:WPF drag & drop events not getting through if drag target is obscured by other graphics 【发布时间】:2013-03-11 18:06:37 【问题描述】:

在下图中,有 6 个橙色矩形,它们充当放置目标。蓝色矩形在橙色矩形的前面。蓝色和橙色矩形都是同一个容器的子级。

我遇到的问题是当光标位于蓝色矩形上时,DragEnter、DragLeave 和 Drop 事件没有被触发。蓝色矩形似乎阻止了事件进入橙色矩形。这意味着用户必须在蓝色矩形之间精确定位光标才能放下项目。我想扩大放置区域以包括整个橙色矩形,同时在橙色矩形前面仍然有蓝色矩形。

如果它很重要,橙色矩形是 FrameworkElements,蓝色矩形是 DrawingVisuals。 FrameworkElements 具有拖放功能,而 DrawingVisuals 非常简单,没有。

如何让橙色矩形的 DragEnter、DragLeave 和 Drop 事件在光标悬停时触发,无论光标是否位于蓝色矩形上?

【问题讨论】:

你可以制作蓝色矩形IsHitTestVisible="False" 或者你还需要从蓝色矩形中截取鼠标事件吗? @sa_ddam213 我在某个时候尝试过,但 IsHitTestVisible 似乎不适用于 DrawingVisuals。 啊,那么也许在橙色矩形上使用PreviewDragLeave @sa_ddam213,有趣的想法,但仍然行不通。我认为因为这不是冒泡/隧道问题,而是命中测试问题。蓝色矩形在视觉树中不是更高/更低,它只是同一级别的不同 z 层(即,橙色不是蓝色的父级或子级)。 你能做一个你的布局的小样本 xaml,所以我可以看看。 【参考方案1】:

我能想到的最合理的解决方案是将橙色矩形放在蓝色矩形的顶部

但是,因为我不希望橙色矩形覆盖蓝色矩形,所以我必须想出一个由透明矩形和橙色帽子组成的视觉效果,如下图所示:

所以,它是这样工作的:

目标是能够通过拖放更改蓝色矩形的顺序(在我的真实应用中,蓝色矩形可能不止三个,而蓝色矩形并不是真正的蓝色矩形)。 通常只绘制蓝色矩形和透明矩形。 (当然,用户只看到蓝色矩形。) 如果用户拖动蓝色矩形,如果光标位于透明矩形上方,则会出现橙色帽子。 一旦光标离开透明矩形,橙色帽子就会消失。 删除蓝色矩形后,所有蓝色矩形都按新顺序重新绘制(橙色帽子再次被隐藏)。

【讨论】:

以上是关于如果拖动目标被其他图形遮挡,WPF 拖放事件不会通过的主要内容,如果未能解决你的问题,请参考以下文章

20170613-原生拖放

20170613-原生拖放

H5拖动事件复习

鼠标点击事件

javascript中ondragover是啥事件

H5的拖放事件(拖拽删除)