我想为WPF-Control添加悬停效果。
为此,我创建了一个样式触发器,如果Background
为真,则更改IsMouseOver
- 控件的画笔。这样可以正常工作,但是如果我从控件中打开ContextMenu
,则IsMouseOver
会变为false,并且悬停效果会停止,直到ContextMenu
关闭。
我还尝试了MouseEnter
和MouseLeave
的组合,但有了这个,就会有相同的行为。如果打开上下文菜单,将触发MouseLeave。
我理解为什么我不能这样做,但我没有看到一个很好的方法来解决我的要求。有没有人做过这样的事情?
答案 0 :(得分:3)
可以通过创建第二个触发器来解决问题,该触发器检查附加的ContextMenu是否已打开:
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{StaticResource Hover_Brush}"/>
</Trigger>
<DataTrigger Binding="{Binding ContextMenu.IsOpen,RelativeSource={RelativeSource Mode=Self}}" Value="True">
<Setter Property="Background" Value="{StaticResource Hover_Brush}"/>
</DataTrigger>
<强>买者强>
上面的XAML工作正常,但有一个问题:如果样式用于多个项目并且共享控件ContextMenu
,则如果为控件打开上下文菜单,将在所有项目上激活悬停效果。
因此,不得共享上下文菜单。如果在资源中定义,请使用x:Shared =“false”属性禁用共享。如果在控件下直接定义,则不会发生此问题。