下方控件的点击事件

4
我有两个控件A和B。控件B放在A上面。当单击B时,只会触发它的单击事件,但我需要A的单击事件也被触发。是否可以使用路由事件来实现这一点?
这是控件的屏幕截图: alt text http://www.imagebanana.com/img/hu5znv4/buttons.png 当然,这只是一个简化的例子,我正在寻找一种通用方法来引发鼠标光标下/一个位置的所有控件的事件。然而,这个问题的具体解决方案也会对我有所帮助!非常感谢任何提示!
1个回答

2
这可能是由于内部控件的事件处理程序将e.Handled属性设置为true导致的。这将阻止路由事件进一步冒泡。但我刚刚检查了一下,在WPF 4中并没有看到这种行为。
如果e.Handled阻止了您的事件,您可以使用带有布尔handledEventsToo参数的UIElement.AddHandler重载来连接您的点击事件。这必须在代码中完成,而不是在标记中。然后,您应该在外部控件中接收Click事件,并且e.Handled属性已经被设置为true。
当我点击内部按钮时,以下代码确实设置了两个按钮的背景:
<Grid>
    <Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="Click1">
        <Button Width="100" Height="25" Margin="20" Click="Click2" />
    </Button>
</Grid>

代码后台
private void Click1( object sender, RoutedEventArgs e )
{
    ( (Button)sender ).Background = new SolidColorBrush( Colors.Blue );
}

private void Click2( object sender, RoutedEventArgs e )
{
    ( (Button)sender ).Background = new SolidColorBrush( Colors.Red );
    //e.Handled = true; // uncomment to stop bubbling
}

1
值得注意的是,您的解决方案不会像OP一样使“A的单击事件[...]也触发”,尽管在ButtonA上注册的Button.Click处理程序也会捕获该事件。这是一个微妙但重要的区别! - Dan Puzey
1
你好Josh,感谢您的回复。我花了一段时间才找出为什么您的方法可行:您将第二个按钮放置在另一个按钮内部而不是上方。Dans的方式也可以,我只是想知道是否有更舒适的方法。类似自动传递事件的东西,就像将IsHitTestVisible设置为false时所做的那样,但仍然通知IsHitTestVisible为false的控件.. ): - stefan.at.kotlin
@stefan - 你可以使用handledEventsToo参数将MouseLeftButtonDown处理程序添加到根Window对象,然后使用VisualTreeHelper.HitTest查找与被点击的点相交的元素。请参阅http://msdn.microsoft.com/en-us/library/ms752097.aspx#using_a_hit_test_result_callback - Josh
谢谢Josh,这也是一个有趣的想法!已标记为答案。 - stefan.at.kotlin
Stefan,我也在寻找一种将IsHitTestVisible设置为False但仍然能够接收特定鼠标事件的方法:https://dev59.com/Nm865IYBdhLWcg3wSMgw。你最终是怎么做的?对于我来说,直接修改命中测试代码让我感到不舒服,因为在我的情况下,底层控件是动态生成的。我相信这样做是可行的,但对我来说似乎不是正确的解决方案。 - stone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接