VisualStateManager不会还原为原始状态

时间:2016-12-22 08:18:08

标签: xaml animation uwp visualstatemanager visualstates

以下定义用作ItemContainerGridView" Single"的SelectionMode样式。选择元素后,特定字形变为可见,表示选择。

它适用于Windows 8.1,但是对于UWP,它接受更改状态:选择使字形显示,但不会恢复到原始状态(状态未选择),即使SelectionChanged事件将旧选择作为已移除的项目,也会更改选择的字形。

其他状态存在类似问题(例如 Pressed Focused ),为简单起见,我不会显示完整的VisualStateManager。

<Style x:Key="MyItemContainerStyle" TargetType="SelectorItem">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="SelectorItem">
                <Border>
                    <Grid>
                        <!--  Layout of the grid  -->
                    </Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="SelectionStates">
                            <VisualState x:Name="Unselected" />
                            <VisualState x:Name="SelectedUnfocused">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                                                     Storyboard.TargetProperty="Opacity"
                                                     To="1"
                                                     Duration="0" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Selected">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                                                     Storyboard.TargetProperty="Opacity"
                                                     To="1"
                                                     Duration="0" />
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

也试过

<VisualState x:Name="Unselected">
    <Storyboard>
        <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                         Storyboard.TargetProperty="Opacity"
                         To="0"
                         Duration="0" />
    </Storyboard>
</VisualState>

但没有帮助。

1 个答案:

答案 0 :(得分:0)

根据您发布的代码,您似乎使用的是Windows 8.1中定义的VisualStateGroupVisualState。但是,在UWP中,这些VisualState已被更改。

GridViewItem styles and templates中,它列出了控件默认样式中定义的所有VisualState。正如您所看到的,在UWP中,没有“ SelectionStates VisualStateGroup,也没有“未选中VisualState。所以你的代码在UWP中不起作用。

要解决您的问题,我建议您根据UWP中使用的新GridViewItem styles and templates重写您的样式。在新风格中,“普通”和“选定”视觉状态属于同一个视觉状态组。因此,您可以在“已选择”中显示“SelectingGlyph”并将其隐藏在“正常”中,如:

<VisualState x:Name="Normal">
    <Storyboard>
        <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                         Storyboard.TargetProperty="Opacity"
                         To="0"
                         Duration="0" />
        <PointerUpThemeAnimation Storyboard.TargetName="ContentPresenter" />
    </Storyboard>
</VisualState>
...
<VisualState x:Name="Selected">
    <Storyboard>
        <DoubleAnimation Storyboard.TargetName="SelectingGlyph"
                         Storyboard.TargetProperty="Opacity"
                         To="1"
                         Duration="0" />
        ...
    </Storyboard>
</VisualState>