2010-07-01 52 views
3

我有两个控件A和B.控件B放在A上面。当点击B时,它的点击事件被触发,但是我需要A的点击事件才能触发。这可以以某种方式使用路由事件来实现吗?其他控件下面的控件的点击事件

这里的控件的截图:

alt text http://www.imagebanana.com/img/hu5znv4/buttons.png

当然,这种情况下,仅仅是减少的例子,我在寻找一个通用的方法,以提高鼠标光标下面的所有控件的事件/时一个位置。 Hoewever,这个问题的具体解决方案也能帮助我!非常感谢您的任何提示!

回答

2

如果内部控件的事件处理程序将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 
} 
+1

值得关注的是你的解决方案*不*使 “的'A' [...]火click事件太” 为每OP - 虽然处理器在'ButtonA' *上注册的'Button.Click'也将捕获该事件。这是一个微妙但重要的区别! – 2010-07-01 13:59:19

+1

你好乔希,谢谢你的回复。花了我一段时间来找出为什么你的作品:你把第二个按钮*放在*里面,而不是上面*另一个。丹斯的方式也是可能的,我只是想知道是否有更舒适的方式。像IsHitTestVisible设置为false时自动传递事件一样,但仍然通知控件IsHitTestVisible为false ..): – 2010-07-01 14:08:45

+0

@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

相关问题