我尝试根据项目是否被选中来更改WinRT应用程序中ListViewItem的显示。在WPF中,我会使用样式触发器,但这在WinRT中不可用。所以在搜索网页一段时间后,我想我必须使用视觉状态管理器。据我所知,ListView有一个可视状态组“SelectionStates”,它保存着我感兴趣的状态。所以我想出了我在ListView上应用的以下ItemContainerStyle:
<Style x:Key="itemContainerStyle" TargetType="SelectorItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="SelectorItem">
<Grid>
<TextBlock x:Name="textBlock" Text="{Binding}" Visibility="Visible" />
<TextBox x:Name="textBox" Text="{Binding Path=Name, Mode=TwoWay}" Visibility="Collapsed" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="SelectionStates">
<VisualState x:Name="Unselected" />
<VisualState x:Name="Selected">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="textBox" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible" />
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="textBlock" Storyboard.TargetProperty="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
正常项目按预期显示(所以我假设我的样式已应用),但选择内容根本不起作用。为什么?我假设状态是自动触发的,不是吗?那么我该如何解决呢?
注意:我使用“SelectorItem”作为目标类型,因为我也希望在网格视图上使用相同的样式。那是问题吗?将它更改为“ListViewItem”并没有解决我的问题...
提前致谢, 克里斯托弗
答案 0 :(得分:0)
您需要使用(UIElement.Visibility)
作为DiscreteObjectKeyFrame
的{{1}}属性的值。
Value
答案 1 :(得分:0)
我发现了问题:列表的SelectionMode
设置为None
。因此,状态变化从未触发过。
此外,还有多个选择状态,如SelectedUnfocused
,必须予以考虑。我发现在“样式和模板”上进行网络搜索对于在MSDN上找到合适的页面非常有帮助。