【问题标题】:Click event for controls below other controls其他控件下方控件的单击事件
【发布时间】:2011-03-10 15:45:37
【问题描述】:

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

这是控件的屏幕截图:

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

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

【问题讨论】:

    标签: wpf events routed-events


    【解决方案1】:

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

    【讨论】:

    • 值得注意的是,根据 OP,您的解决方案 不会 使“A [...] 的点击事件也触发” - 尽管 @ 的处理程序在ButtonA 上注册的987654327@ 也能赶上这个事件。这是一个微妙但重要的区别!
    • 您好乔希,感谢您的回复。我花了一段时间才知道为什么你的工作:你把第二个按钮 inside 而不是 above 另一个。 Dans方式也是一种可能性,我只是想知道是否有更舒适的方式。就像当 IsHitTestVisible 设置为 false 时自动传递事件一样,但仍然通知控件 IsHitTestVisible 为 false ..):
    • @stefan - 您可以使用handledEventsToo 参数将MouseLeftButtonDown 处理程序添加到根Window 对象,然后使用VisualTreeHelper.HitTest 找出哪些元素与单击的点相交。见msdn.microsoft.com/en-us/library/…
    • 谢谢乔希,这也是一个有趣的想法!标记为答案。
    • Stefan,我也在寻找一种将 IsHitTestVisible 设置为 False 的方法,但仍会收到某些鼠标事件的通知:stackoverflow.com/questions/3893809/…。你最后做了什么?我真的不喜欢弄乱命中测试代码,因为在我的例子中,下面的控件是动态生成的。我确信它会起作用,但对我来说似乎是错误的解决方案。
    猜你喜欢
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2017-02-25
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多