首页 > 解决方案 > UWP AdaptiveGridView ItemContainerStyleSelector 不起作用

问题描述

我面临着 UWP 的一个新问题。这次我尝试展示一个包含不同项目的 AdaptiveGrid,所以我为每个项目都有一个 DataTemplate 选择器,我要做的最后一件事是:根据它的类更改ItemHeight每个项目的。GridViewItemDataTemplateSelector 就像一个魅力......因此我创建了一个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>

最后......我的背景没有改变......所以,也许你们中的一个人可以指出我正确的方向......

标签: c#gridviewuwp

解决方案


您的 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;
    }
}

推荐阅读