WPF 触发器和 VisualState 同时实现?

问题描述 投票:0回答:2

如何同时使用

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>

但是我该如何结合这些呢?

wpf xaml
2个回答
0
投票

您可以在新的

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>

0
投票

刚刚遇到了类似的问题并最终来到这里,因此如果您需要一个适合我的用例的视觉状态解决方案。 根据您想要优先的顺序更改 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>

问题是它仍然会同时触发鼠标悬停在单独的项目上并选择。

© www.soinside.com 2019 - 2024. All rights reserved.