【问题标题】:Can I set IsHitTestVisible to false only for right-button events?我可以只为右键事件将 IsHitTestVisible 设置为 false 吗?
【发布时间】:2010-01-18 17:44:18
【问题描述】:

显然,对这个问题的直接回答是“否”,但对我来说,实现这种效果的最佳方法是什么?为了解释,这里有一点背景......

我有一个应用程序,它显示一个图像以及该图像上的几层叠加形状。所有这些都放置在一个网格单元中,彼此重叠,图像位于局部 z 顺序的底部。为了速度,叠加层被实现为从 FrameworkElement 派生的类,它们创建和管理自己的视觉效果。

这是一个基本图(尽管分解为 3D),说明了层的排列方式以及它们具有/需要的交互:


overlapped_controls.png http://www.afterbang.co.uk/mal/stackoverflow/overlapped_controls.png


如您所见,上层叠加层必须允许用户在图像中的任何位置拖出一个新矩形。为此,我给了它一个透明的背景,就像一块可以在上面画画的玻璃板。这样做的明显缺点是它会阻止所有鼠标事件向下传递到较低层。

我真的很想只在顶层的透明区域中捕获 鼠标按钮的事件,并让其他事件在 z 顺序更下方的层中命中。

对于这种事情,我应该遵循 WPF 模式吗?有什么最佳实践或技术吗?

我对 WPF 还很陌生,但想编写一个与 API 一致的解决方案。谢谢。

【问题讨论】:

    标签: wpf events mouse z-order hittest


    【解决方案1】:

    我会在需要右键单击的元素上使用PreviewMouseDown 事件,并在需要左键单击的元素上使用LeftMouseDownPreviewMouseDown 事件仍会触发,但您可以编写处理程序来忽略左键单击。

    这实际上是我用来在图像顶部显示形状的模式,以便用户可以圈出图像的一部分以突出显示它。我在图像上有PreviewMouseDown,它一直正常运行,然后我在任何形状上都有一个LeftMouseDown 处理程序,以便可以移动、删除它们等。

    【讨论】:

    • 谢谢 - 我已将图片上传到新网站并相应更新了其 URL。希望它修复它。并感谢 PreviewMouseDown 的提示。我曾考虑过,但不确定这是按部就班的做法。
    • 好吧,老实说,有时“按部就班”的方式并不适用于所有情况。在我的情况下,我不会把我的形状放在它们自己的层中。我不确定官方的做法是什么,但PreviewMouseDown 的方式在我的代码中看起来非常干净,就像我必须为其他事件设置所有内容一样。
    • 我想知道你是如何组织你的东西的。我尝试了 PreviewXXX 方法,然后才意识到它永远不会对我有用,因为我的图像不是逻辑(或视觉)树中形状图层的父级。请注意,我真的想将形状图层的逻辑与图像分开,所以我怀疑我最终会将这两个东西放在某种父控件中并使用 PreviewXXX 事件为子图层提供功能。走着瞧。 :) 如果我想出一些好的东西,我会在这里再次发布。
    • 是的,您必须让它们都具有一个逻辑父级。我在父网格上处理了 (s)>PreviewMouseDown 事件。跨度>
    猜你喜欢
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2022-01-18
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多