GridView的ItemContainerStyle和选择状态

时间:2014-05-28 07:30:38

标签: xaml windows-runtime winrt-xaml windows-8.1

我尝试在选择gridview项目时更改它们的外观。 (之前,我使用了ViewModel对象中的IsSelected属性绑定到包含网格和bool-to-color转换器的技巧,但我认识到它很糟糕)

为此,我这样做:

    <GridView ItemContainerStyle="{StaticResource GridViewItemContainerStyle}" ...> ...

    <Style x:Key="GridViewItemContainerStyle" TargetType="GridViewItem">
        <Setter Property="Background" Value="Red" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GridViewItem">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Grid.Background)" Storyboard.TargetName="itemGrid">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="Black"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="UnselectedSwiping"/>
                                <VisualState x:Name="UnselectedPointerOver"/>
                                <VisualState x:Name="Selecting"/>
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Grid.Background)" Storyboard.TargetName="itemGrid">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="White"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="SelectedSwiping"/>
                                <VisualState x:Name="Unselecting"/>
                                <VisualState x:Name="Unselected"/>
                                <VisualState x:Name="SelectedUnfocused"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>

                        <Grid ... x:Name="itemGrid">
                              <!-- HERE MY DATA TEMPLATE -->
                        </Grid>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

当我运行应用程序时,项目为黑色(如&#34;正常&#34;状态)。但选择它们并不会使它们变成白色。我哪里错了?

此外,有一种方法可以设置&#34; ItemContainerStyle&#34;没有它&#34;覆盖&#34; &#34; ItemTemplate&#34; ???

1 个答案:

答案 0 :(得分:4)

DataTemplate 应位于网页XAML中 GridView 元素的 ItemTemplate 属性中。创建一个单独的XAML文件(ResourceDictionary),例如 CustomStyles.xaml 。在 App.xaml 中引用它,如下所示:

    <Application.Resources>
    <!-- Application-specific resources -->
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="PathToCustomStyles.xaml" />             
        </ResourceDictionary.MergedDictionaries>          
    </ResourceDictionary>
</Application.Resources>

您可以在MSDN上找到 GridViewItem http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj709915.aspx)的默认模板,在默认样式部分下(第二个,更长的XAML)。

复制并粘贴到 CustomStyles.xaml 中。只需给它一些关键:

<Style TargetType="GridViewItem" x:Key="CustomGridViewItemStyleWithWhiteSelectionBackground">...

如您所见,选定的视觉状态会更改三个目标的不透明度, SelectionBackground SelectedBorder SelectedCheckMark 。因此,这些元素在 Normal 状态下不可见,因为它们的不透明度为零。在下面找到这三个元素,并根据需要更改其属性。对于背景更改 SelectionBackground 矩形的填充属性:

<Rectangle x:Name="SelectionBackground"
    Margin="4"
    Fill="White"
    Opacity="0" />

现在,当选择发生时,此元素的不透明度将更改为1,因为您将其设置为白色,所选项目的背景将为白色。并且不要忘记在GridView的定义中引用这种风格:

<GridView ItemContainerStyle="{StaticResource CustomGridViewItemStyleWithWhiteSelectionBackground}" ...>
    <GridView.ItemTemplate>
    <DataTemplate>
    ...define your template here...
    </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

修改

这是扩展样式的XAML,可能更适合一些更复杂的样式更改。如果您只想更改背景,您应该从默认样式部分下面的MSDN链接中获取第一个样式,然后编辑它(并给它一些样式键,这样你就不会#39 ; t覆盖默认值:):

SelectedBackground="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}"