Windows 根据选择状态更改WinRT应用程序中列表项的模板

Windows 根据选择状态更改WinRT应用程序中列表项的模板,windows,xaml,winrt-xaml,Windows,Xaml,Winrt Xaml,我尝试根据是否选择了ListViewItem来更改WinRT应用程序中ListViewItem的显示。在WPF中,我会使用样式触发器,但这在WinRT中不可用。因此,在搜索web一段时间后,我想我必须使用可视化状态管理器。据我所知,ListView有一个可视状态组“SelectionStates”,它保存我感兴趣的状态。因此,我在ListView上应用了以下ItemContainerStyle: <Style x:Key="itemContainerStyle" Targe

我尝试根据是否选择了ListViewItem来更改WinRT应用程序中ListViewItem的显示。在WPF中,我会使用样式触发器,但这在WinRT中不可用。因此,在搜索web一段时间后,我想我必须使用可视化状态管理器。据我所知,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”并没有解决我的问题

提前感谢,, Christoph

您需要使用
(UIElement.Visibility)
作为
离散对象关键帧的
属性的值

<VisualState x:Name="Selected">
    <Storyboard>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="textBox" Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="textBlock" Storyboard.TargetProperty="(UIElement.Visibility)">
            <DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
        </ObjectAnimationUsingKeyFrames>
    </Storyboard>
</VisualState>

我发现了问题:列表的
SelectionMode
设置为
None
。因此,状态更改从未触发


此外,还必须考虑多种选择状态,如
selectednfoccused
。我发现在网上搜索“样式和模板”对于在MSDN上找到合适的页面非常有帮助。

谢谢你的建议。我已经改变了,但我没有任何效果。。。我觉得状态更改根本没有被触发,但我不知道如何调试它。好的,检查一下,我认为视觉状态没有正常工作。感谢您的帮助-我同时发现了问题:列表中的选择被禁用。Hay@Christoph,我有同样的问题,如果列表中的选择被禁用,那么我可以在ListviewItem样式中使用VisualState管理器中的SelectionStates。由于焦点状态工作正常,但我需要SelectionStates,因为当我们失去焦点时,VisualState中的动画会反转,如何覆盖此plz。