【问题标题】:Disable event bubbling禁用事件冒泡
【发布时间】:2011-10-24 19:18:00
【问题描述】:

我有这种风格:

        <Style TargetType="{x:Type Expander}">
            <Setter Property="BorderBrush" Value="LightGray"/>
            <Setter Property="Margin" Value="5"/>

            <EventSetter Event="Mouse.MouseEnter" Handler="ExpanderMouseEnter"/>
            <EventSetter Event="Mouse.MouseLeave" Handler="ExpanderMouseLeave"/>
        </Style>

当我将扩展器作为子扩展器添加到扩展器并将鼠标悬停在子扩展器上时,两个扩展器都变为灰色。如何将 e.handled = true 设置为事件以阻止它冒泡?

编辑: 好的,所以我必须编辑样式来调用代码隐藏方法。方法如下:

Private Sub ExpanderMouseEnter(ByVal sender As Expander, ByVal e As MouseEventArgs)
        sender.Background = Brushes.LightGray
        e.Handled = True
    End Sub

    Private Sub ExpanderMouseLeave(ByVal sender As Expander, ByVal e As MouseEventArgs)
        sender.Background = Brushes.White
        e.Handled = True
    End Sub

但没有任何改变。有什么问题?

【问题讨论】:

    标签: wpf


    【解决方案1】:

    理想情况下,编写Trigger 以使用IsMouseDirectlyOver 标志更改背景应该可以工作,因为此标志旨在供UIElements 激活仅鼠标直接位于其上的触发器。

    但是对于扩展器来说似乎失败了,因为内部扩展器是外部扩展器可视化树的一部分。

    我相信您可能会考虑在扩展器的 Header 元素上设置 IsMouseOver 触发器。它们相互排斥对方的视觉树。因此,当您将鼠标悬停在标题上时,扩展器将获得其特有的背景颜色。

    【讨论】:

    • 这适用于 HeaderedContentControls,但更普遍的情况是,IsMouseDirectlyOver 不会出现这个问题,用于任意嵌套的控件(例如 Button 中的 Button)?
    【解决方案2】:

    看起来这在不使用代码隐藏的情况下是不可能的,因为TriggerEventTrigger(您可以在这种情况下交替使用)都没有公开任何相关功能。

    除非您可以解决该问题(例如,仅将样式或其部分应用于后代扩展器),否则您必须在代码隐藏中实现事件处理程序并从那里设置 Handled 属性。

    【讨论】:

      【解决方案3】:

      我认为真正的问题是当鼠标从外部扩展器移动到内部扩展器时不会触发MouseLeave 事件。结果,Triggers 中使用的 IsMouseOver 属性在两者上均保持设置(如您的原始问题所示)。因此,即使您可以在鼠标进入第二个扩展器时将Handled 属性设置为True,您的Trigger 仍将在外部控件和背景设置上处于活动状态。

      【讨论】:

        猜你喜欢
        • 2011-01-30
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 2011-10-20
        • 2011-08-23
        • 1970-01-01
        • 2021-08-14
        相关资源
        最近更新 更多