我正在使用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
的描述文本块只会拉出框。
倒塌的物品,hovewer,似乎没有按照任何规则运作。许多项目的宽度与标题TextBlock
的宽度相同,但有些项目的长度约为30 px。有时候正常工作的全宽项目,但这似乎是随机的。
我也尝试过单独使用这些模板,没有LibraryItemTemplateSelector
类,而且效果很好。
Conslusions:
我认为TemplateSelector
抽象类存在问题,因为没有它,一切正常,但我无法确切地说出错误。
我已将HorizontalContentAlignment
设置为ItemContainerStyle
中的拉伸,我还在绝望中尽可能添加了HorizontalAlignment="Stretch"
属性。毋庸置疑,这不起作用。
我在这里做错了什么?上面的抽象类是否有问题,或者ItemTemplate不应该以这种方式工作?
谢谢!
答案 0 :(得分:0)
试试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 );
}