【问题标题】:Not all ListView Items are stretched when using multiple ItemTemplates使用多个 ItemTemplate 时,并非所有 ListView 项目都被拉伸
【发布时间】:2016-04-29 15:07:25
【问题描述】:

我正在开发一个 Windows Phone 8.1 应用程序,我需要根据项目的状态显示两个不同的项目模板。

要在我的模板之间切换,我使用了一些博客或其他东西上建议的 TemplateSelector 抽象类。代码如下:

public abstract class TemplateSelector : ContentControl
{
    public abstract DataTemplate SelectTemplate(object item, DependencyObject container);

    protected override void OnContentChanged(object oldContent, object newContent)
    {
        base.OnContentChanged(oldContent, newContent);

        ContentTemplate = SelectTemplate(newContent, (DependencyObject)this);
    }
}

之后我创建了一个继承类:

public class LibraryItemTemplateSelector : TemplateSelector
{
    public DataTemplate Expanded
    {
        get;
        set;
    }

    public DataTemplate Collapsed
    {
        get;
        set;
    }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var v = ApplicationData.Current.LocalSettings.Values;
        var ffs = item as FFStory;
        if (ffs != null)
        {
            if (v.ContainsKey("alwaysExpanded"))
            {
                if ((bool)v["alwaysExpanded"] == true)
                    return Expanded;
            }
            var result = ...
            ...
            if (result == 1)
                return Collapsed;
            else return Expanded;
        }
        return null;
    }
}

接下来,我在 XAML 中使用 <ItemTemplate><DataTewmplate> 标记内的类名来为项目分配模板:

<local:LibraryItemTemplateSelector Content="{Binding}" Expanded="{StaticResource expandedItem}" Collapsed="{StaticResource collapsedItem}" HorizontalAlignment="Stretch" />

问题:

当我启动应用程序时,所有项目的宽度似乎都是随机的。

展开的项目都是全角的,但这是可以理解的。设置了WrapText=WrapWholeWords 的描述文本块只是将框拉长。

不过,折叠的物品似乎不符合任何规则。许多项目的宽度与标题 TextBlock 相同,但有些项目的宽度约为 30 像素。有时会有正常工作的全角项目,但这似乎是随机的。

我也尝试过单独使用这些模板,没有 LibraryItemTemplateSelector 类,效果很好。

结论:

我认为TemplateSelector 抽象类有问题,因为没有它一切正常,但我无法准确判断问题所在。

我已经在ItemContainerStyle 中将HorizontalContentAlignment 设置为Stretch,我还在绝望中尽可能添加了HorizontalAlignment="Stretch" 属性。不用说,这没有用。

我在这里做错了什么?上面的抽象类是否有问题,或者 ItemTemplate 不应该以这种方式工作?

谢谢!

【问题讨论】:

    标签: c# xaml listview windows-phone-8.1


    【解决方案1】:

    试试这个代码DataTemplateSelector:

        public class ProfilePageTemplateSelector : DataTemplateSelector
        {
            public DataTemplate dtPostTemplate { get; set; }
            public DataTemplate dtCommentTemplate { get; set; }
    
            protected override DataTemplate SelectTemplateCore( object item, DependencyObject container )
            {
                var uiElement = container as UIElement;
                if ( uiElement == null )
                {
                    return base.SelectTemplate( item, container );
                }
    
                if ( item is Post )
                {
                    return dtPostTemplate;
                }
                else if ( item is Comment )
                {
                    return dtCommentTemplate;
                }
                return base.SelectTemplateCore( item, container );
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多