如何同时使用
Trigger
IsSelected
和 VisualState
MouseOver
?如果未选择某个元素并将其悬停,我不想应用样式。
单独触发器很简单:
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
...
</Trigger>
</ControlTemplate.Triggers>
仅 VisualStates 也是如此:
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="MouseOver">
<Storyboard>
...
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
但是我该如何结合这些呢?
您可以在新的
VisualState x:Name="Selected"
中定义 VisualStateGroup x:Name="SelectedStates"
。然后,因为每次控件只有来自每组的一个状态,所以 MouseOver 和 Selected 是彼此独立的。请参阅Mitesh Sureja 的博客。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="MouseOver">
<Storyboard>
...
</Storyboard>
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="SelectedStates">
<VisualState x:Name="Selected">
<Storyboard>
...
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
或者你可以按照克莱门斯的建议去做。请参阅视觉状态管理器与 WPF 中的触发器。
编辑
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<Setter ... />
</MultiTrigger>
</Style.Triggers>
刚刚遇到了类似的问题并最终来到这里,因此如果您需要一个适合我的用例的视觉状态解决方案。 根据您想要优先的顺序更改 MouseOver 和 Selected 的顺序。
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
...
</Storyboard>
</VisualState>
<VisualState x:Name="Selected">
<Storyboard>
...
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
问题是它仍然会同时触发鼠标悬停在单独的项目上并选择。