如果内部控件的事件处理程序将e.Handled属性设置为true,则会发生这种情况。这将阻止路由事件冒泡进一步。但我只是检查,我没有看到WPF 4中的行为。
如果e.Handled阻止您的事件,但您可以执行的操作是使用UIElement.AddHandler重载,该重载采用布尔型handledEventsToo参数来挂钩您的单击事件。这必须在代码中完成,而不是标记。然后,您应该收到外部控件中的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
}
值得关注的是你的解决方案*不*使 “的'A' [...]火click事件太” 为每OP - 虽然处理器在'ButtonA' *上注册的'Button.Click'也将捕获该事件。这是一个微妙但重要的区别! – 2010-07-01 13:59:19
你好乔希,谢谢你的回复。花了我一段时间来找出为什么你的作品:你把第二个按钮*放在*里面,而不是上面*另一个。丹斯的方式也是可能的,我只是想知道是否有更舒适的方式。像IsHitTestVisible设置为false时自动传递事件一样,但仍然通知控件IsHitTestVisible为false ..): – 2010-07-01 14:08:45
@stefan - 您可以使用handlesEventsToo参数将MouseLeftButtonDown处理程序添加到根窗口对象,然后使用VisualTreeHelper.HitTest找出哪些元素与被点击的点相交。请参阅http://msdn.microsoft.com/en-us/library/ms752097.aspx#using_a_hit_test_result_callback – Josh 2010-07-02 02:29:34