Wpf 单击其他控件下面的控件的事件

Wpf 单击其他控件下面的控件的事件,wpf,events,routed-events,Wpf,Events,Routed Events,我有两个控件A和B。控件B放在A上。单击B时,只会触发其单击事件,但我也需要触发A的单击事件。这可以通过使用路由事件以某种方式实现吗 以下是控件的屏幕截图: 当然,这个例子只是一个简化的例子,我正在寻找一种在鼠标光标下方/某个位置的所有控件上引发事件的通用方法。Hoewever,这个问题的具体解决方案也会对我有所帮助!非常感谢您的任何提示 如果内部控件的事件处理程序将e.Handled属性设置为true,则可能发生这种情况。这将防止路由事件进一步冒泡。但我只是检查了一下,在WPF4中没有看到这

我有两个控件A和B。控件B放在A上。单击B时,只会触发其单击事件,但我也需要触发A的单击事件。这可以通过使用路由事件以某种方式实现吗

以下是控件的屏幕截图:


当然,这个例子只是一个简化的例子,我正在寻找一种在鼠标光标下方/某个位置的所有控件上引发事件的通用方法。Hoewever,这个问题的具体解决方案也会对我有所帮助!非常感谢您的任何提示

如果内部控件的事件处理程序将e.Handled属性设置为true,则可能发生这种情况。这将防止路由事件进一步冒泡。但我只是检查了一下,在WPF4中没有看到这种行为

如果e.Handled阻止了您的事件,那么您可以使用重载来连接click事件,重载采用布尔handledEventsTo参数。这必须在代码中完成,而不是在标记中完成。然后您应该在外部控件中接收到Click事件,并且e.Handled属性已经设置为true

下面的代码在我单击内部按钮时设置了两个按钮的背景

<Grid>
    <Button VerticalAlignment="Center" HorizontalAlignment="Center" Click="Click1">
        <Button Width="100" Height="25" Margin="20" Click="Click2" />
    </Button>
</Grid>

值得注意的是,您的解决方案不会使“点击事件的
A
[…]也发生火灾”,尽管
按钮有一个处理程序。点击
注册在
按钮上的
也会捕获事件。这是一个微妙但重要的区别!你好,乔希,谢谢你的回复。我花了一段时间才弄明白为什么你的按钮能工作:你把第二个按钮放在里面,而不是放在另一个上面。丹的方式也是可能的,我只是想知道是否有更舒适的方式。类似于自动传递事件,如在IshittesVisible设置为false时完成,但仍会通知控件IshittesVisible为false的位置..):@stefan-您可以使用HandledEventsTo参数将MouseLeftButtonDown处理程序添加到根窗口对象,然后使用VisualTreeHelper.HitTest找出哪些元素与单击的点相交。谢谢你,乔希,这也是一个有趣的想法!标记为answer.Stefan,我也在寻找一种方法,将IshitteVisible设置为False,但仍会收到某些鼠标事件的通知:。你最后做了什么?我真的不太喜欢处理命中测试代码,因为在我的例子中,下面的控件是动态生成的。我相信它会起作用,但对我来说似乎是错误的解决方案。
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
}