c# - UWP AdaptiveGridView ItemContainerStyleSelector 不起作用
问题描述
我面临着 UWP 的一个新问题。这次我尝试展示一个包含不同项目的 AdaptiveGrid,所以我为每个项目都有一个 DataTemplate 选择器,我要做的最后一件事是:根据它的类更改ItemHeight
每个项目的。GridViewItem
DataTemplateSelector 就像一个魅力......因此我创建了一个StyleSelector
:
public class CardStyleTemplateSelector : StyleSelector
{
public Style CategoryStyle { get; set; }
public Style ReceipeStyle { get; set; }
public new Style SelectStyle(object item, DependencyObject container)
{
switch (item)
{
case Category category:
return CategoryStyle;
case Receipe receipe:
return ReceipeStyle;
}
return null;
}
}
很简单......所以我添加了一些样式:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="Category" TargetType="controls:AdaptiveGridView">
<Setter Property="ItemHeight" Value="240"/>
<Setter Property="Background" Value="Azure" />
</Style>
<Style x:Key="Receipe" TargetType="controls:AdaptiveGridView">
<Setter Property="ItemHeight" Value="400"/>
</Style>
</ResourceDictionary>
并在我的页面上使用此 XAML 完成:
<controls:AdaptiveGridView
Padding="{StaticResource MediumLeftRightMargin}"
animations:Connected.ListItemElementName="itemThumbnail"
animations:Connected.ListItemKey="animationKeyCategoryOverview"
DesiredWidth="220"
Margin="0,50,0,0"
IsItemClickEnabled="True"
ItemClick="OnItemClick"
ItemsSource="{x:Bind Source,Mode=OneWay}"
SelectionMode="None"
StretchContentForSingleRow="False"
ItemTemplateSelector="{StaticResource TemplateSelector}"
>
<controls:AdaptiveGridView.ItemContainerStyleSelector>
<templateSelectors:CardStyleTemplateSelector ReceipeStyle="{}" CategoryStyle="{StaticResource Category}" />
</controls:AdaptiveGridView.ItemContainerStyleSelector>
最后......我的背景没有改变......所以,也许你们中的一个人可以指出我正确的方向......
解决方案
您的 CardStyleTemplateSelector 的实现不正确,您需要重写其 SelectStyleCore 以返回不同的样式,并且 TargetType 应该是 GridViewItem 而不是 AdaptiveGridView。例如:
.xaml:
<Style TargetType="GridViewItem" x:Key="Category">
<Setter Property="Background" Value="LightGray"/>
</Style>
<Style TargetType="GridViewItem" x:Key="Receipe">
<Setter Property="Background" Value="Red"/>
</Style>
......
<controls:AdaptiveGridView.ItemContainerStyleSelector>
<local:CardStyleTemplateSelector ReceipeStyle="{StaticResource Receipe}" CategoryStyle="{StaticResource Category}" />
</controls:AdaptiveGridView.ItemContainerStyleSelector>
。CS:
public class CardStyleTemplateSelector : StyleSelector
{
public Style CategoryStyle { get; set; }
public Style ReceipeStyle { get; set; }
protected override Style SelectStyleCore(object item, DependencyObject container)
{
switch (item)
{
case Category category:
return CategoryStyle;
case Receipe receipe:
return ReceipeStyle;
}
return null;
}
}