【发布时间】: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