我有这种风格:
<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
但没有任何变化。有什么问题?
答案 0 :(得分:2)
理想情况下,使用Trigger
标记来更改背景IsMouseDirectlyOver
应该有效,因为此标志旨在让UIElements仅激活直接在鼠标上的触发器。
但是扩展器似乎失败了,因为内扩展器是外扩展器视觉树的一部分。
我相信您可能会考虑在扩展器的IsMouseOver
元素上触发Header
。它们互相排斥彼此的视觉树。因此,当您将鼠标悬停在标题上时,扩展器将获得其特有的背景颜色。
答案 1 :(得分:0)
看起来这不可能不使用代码隐藏,因为Trigger
和EventTrigger
(在这种情况下可以替代使用)都不会暴露任何相关的功能。
除非您可以解决此问题(例如,仅将样式或部分应用于后代扩展器),否则您必须在代码隐藏中实现事件处理程序并设置Handled
属性那里。
答案 2 :(得分:0)
我认为真正的问题是当鼠标从外扩展器移动到内扩展器时,不会触发MouseLeave
事件。因此,IsMouseOver
中使用的Triggers
属性仍然设置在两者上(与原始问题一样)。因此,即使您可以在鼠标进入第二个扩展器时将Handled
属性设置为True
,您的Trigger
仍将在外部控件和背景设置上处于活动状态。