【问题标题】:How to get control with lower zindex when mouse clicked in wpf?在wpf中单击鼠标时如何使用较低的zindex进行控制?
【发布时间】:2012-04-23 11:11:17
【问题描述】:

我在同一个画布中有多个控件,可能一个被另一个覆盖。它们都具有相同的 zIndex,但对于加载的顺序,一些向上,另一些向下。 如果 Acontrol 超过 Bcontrol,我的问题是,我点击它们,但只有 A 获得点击事件。我怎样才能让 B 也得到这个事件?谢谢。

【问题讨论】:

  • 您尝试过将 MouseClick 事件中的处理属性设置为 false 吗?

标签: c# wpf controls mouseevent z-index


【解决方案1】:

如果您只希望后面的控件获取事件,那么对于第一个前面的所有控件,您必须为后面的控件设置 IsHitTestVisible = False 以获取事件 - 但这不是你想要什么。

如果你想让他们都参与到活动中,可以把整个 UI 想象成一棵元素树。您所说的所有这些控件都是同级控件。当单击某些内容时,父级首先收到通知,如果它不处理单击,则将其传递给该父级在该鼠标位置的可见子元素,依此类推,直到处理完毕。阻止被点击的子节点处理鼠标点击的唯一方法是让所有兄弟节点的共同父节点首先处理该事件。

然后,您必须在父处理程序中执行一些巧妙的操作,以调用鼠标下方所有子元素的单击事件 - 问题在于,虽然框架过去常常进行艰苦的工作来确定哪个控件是在鼠标下,您现在将不得不做这项艰苦的工作。

【讨论】:

    【解决方案2】:

    没有机会。即使您将 MouseClick 标记为未处理,它也会路由到父元素(Canvas)而不是兄弟元素。唯一的方法是命中测试。当用户点击 Acontrol 时,你应该hit-test 来确定它下面是否有另一个控件。

    您必须使用带有回调的命中测试。这允许您跳过 Acontrol 以找到 Bcontrol。如果找到了,就可以把Bcontrol当成被点击了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 2012-05-21
      • 1970-01-01
      相关资源
      最近更新 更多