我正在爲WP7開發一個電視列表應用程序,但是我遇到了Pivot控件的問題:我嘗試添加所有可用的EPG頻道,但性能非常差(即使在真實的電話),需要約10-15秒添加25 空 PivotItems,沒有任何數據或控制。支持許多PivotItems
所以我測試了一個動態/懶惰負載導向的方法,首先只加載三個項目,然後每增加一個用戶向左或向右滑動。問題在於,當向左滑動新項目時,將數據綁定集合中的當前項目向右推動一個插槽,在屏幕上產生凌亂的渲染:這並不令人驚訝,因爲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。 索引勢必Pivot.SelectedIndex,Epg.Channels是主模型對象和this.Channels是綁定到Pivot.ItemsSource
EDIT一個ObservableCollection:實測值特技。我記得我有一個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;
};
刪除它提升性能,而無需退出卡利。是的,我知道,這是進一步調查,但現在它修復了所有的東西。
不要這樣做。你真的希望用戶使用Pivot輕彈25個項目嗎?我記得在某個地方讀了一個指導說,你不應該在一個樞軸上有超過7-8個物品,這是一個非常好的規則IMO。您應該對頻道進行分類並創建一個包含ListBox的主頁面,或者甚至可以爲每個類別佔據一個PivotItem的Pivot。當用戶選擇查看某個類別時,會導航到顯示該類別中所有頻道的另一個數據透視表。 – Praetorian
@Praetorian當然不是,實際上應用程序中有一個快速頻道選擇頁面。 – unsafecode