禁用事件冒泡

时间:2011-10-23 22:40:11

标签: wpf

我有这种风格:

        <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

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

3 个答案:

答案 0 :(得分:2)

理想情况下,使用Trigger标记来更改背景IsMouseDirectlyOver应该有效,因为此标志旨在让UIElements仅激活直接在鼠标上的触发器。

但是扩展器似乎失败了,因为内扩展器是外扩展器视觉树的一部分。

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

答案 1 :(得分:0)

看起来这不可能不使用代码隐藏,因为TriggerEventTrigger(在这种情况下可以替代使用)都不会暴露任何相关的功能。

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

答案 2 :(得分:0)

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