我正在为WP7开发一个电视列表应用程序,但我遇到了Pivot控件的问题:我首先尝试添加所有可用的EPG频道,但性能非常差(即使在真正的手机上),花费大约10-15秒来添加25个空数据透视项目,没有任何数据或控制。
所以我测试了一种动态/延迟加载导向的方法,它首先只加载三个项目,然后每次用户向左或向右滑动时再加一个项目。问题是,当向左滑动时,新项目将数据绑定集合中的当前一个推向右侧的一个插槽,在屏幕上产生杂乱的渲染:这并不奇怪,因为SelectedIndex不会更改,但所选项目会。但是,修复SelectedIndex会使事情变得更糟,导致Pivot卡在不一致的布局中。
以下是代码:
public void ChangeChannel(){
if (index < 0) return;
int i = index;
int tot = Epg.Channels.Count;
int slack = (i == 0) ? -1 : i > oldIndex ? 1 : -1;
var ch = this.Channels[i];
var nextIndex = (ch.ChannelIndex + slack) % tot;
if (nextIndex < 0) nextIndex += tot;
var next = Epg.Channels[nextIndex];
if (!this.Channels.Contains(next))
{
if (slack < 0)
{
this.Channels.Insert(0, next);
//Index++;
}
else
this.Channels.Add(next);
}
oldIndex = i;
}
方法通过Caliburn.Micro与Pivot.LoadingPivotItem相关联。 index 绑定到Pivot.SelectedIndex, Epg.Channels 是主模型对象, this.Channels 是绑定到Pivot.ItemsSource的ObservableCollection < / p>
编辑:找到了诀窍。当我回忆起我有一个RSS阅读器应用程序,其中有一个不少于10-12个标签的Pivot工作非常快时,我很怀疑。也就是说,我构建了一个类似的测试应用程序,但没有使用Caliburn。哦,这是一些表现!但是Caliburn如此沉重?不是真的,因为我在默认的AppBootstrapper中发现了这段代码:
ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
(viewModelType, path, property, element, convention) =>
{
if (ConventionManager
.GetElementConvention(typeof(ItemsControl))
.ApplyBinding(viewModelType, path, property, element, convention))
{
ConventionManager
.ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path);
ConventionManager
.ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, viewModelType);
return true;
}
return false;
};
删除它可以提高性能,而无需退出Caliburn。是的,我知道,这是需要进一步研究的东西,但现在它修复了所有的东西。
答案 0 :(得分:3)
枢轴中超过5个项目的任何内容都可能会对性能造成影响 让用户尝试在大量项目之间导航也非常困难。
如果您确实需要使用数据透视表来展示大量项目,可以通过创建一个只包含3个项目的实例并在所选项目更改时更新每个项目的绑定来实现此目的。 目的是填充当前显示的项目两侧的项目。逻辑可能会有点混乱(取决于当前选择的项目和先前显示的项目,更新其他绑定)但它是可行的。
答案 1 :(得分:0)
请考虑使用custom handling of flicking left/right,然后随时更新内容。使用动画,您可以模拟过渡。
我曾经用这种方式创建了一个漫画阅读器。它非常简单,不会影响性能。