我尝试在选择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; ???
答案 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}"