以下定义用作ItemContainer
,GridView
" 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>
但没有帮助。
答案 0 :(得分:0)
根据您发布的代码,您似乎使用的是Windows 8.1中定义的VisualStateGroup和VisualState。但是,在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>