2011-08-31 27 views
1

我正在爲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; 
      }; 

刪除它提升性能,而無需退出卡利。是的,我知道,這是進一步調查,但現在它修復了所有的東西。

+2

不要這樣做。你真的希望用戶使用Pivot輕彈25個項目嗎?我記得在某個地方讀了一個指導說,你不應該在一個樞軸上有超過7-8個物品,這是一個非常好的規則IMO。您應該對頻道進行分類並創建一個包含ListBox的主頁面,或者甚至可以爲每個類別佔據一個PivotItem的Pivot。當用戶選擇查看某個類別時,會導航到顯示該類別中所有頻道的另一個數據透視表。 – Praetorian

+0

@Praetorian當然不是,實際上應用程序中有一個快速頻道選擇頁面。 – unsafecode

回答

3

任何超過5個項目的數據透視可能會有一個noticabel性能影響。
讓用戶試圖在大量項目之間導航也是非常困難的。

如果您確實需要使用數據透視圖來顯示大量商品,您可以通過創建僅包含3個商品的實例並在選定商品更改時更新每個商品的綁定來完成此操作。 目標是填充當前顯示的項目的任一側。邏輯可能會有點混亂(取決於當前選擇的項目和先前顯示的項目,更新其他綁定),但它是可行的。

+0

試過了,但是迄今爲止我看到的性能是最差的,即使是不同的策略(項目替換與綁定更新)。我不知道,也許我會保持一個正確的刷卡只懶惰加載,這工作相當好,順利,但仍然是一個真正的恥辱... – unsafecode

+0

@MattLacey我約束我的ViewModel的樞軸(有3項目,所以樞軸將生成3 PivotItem)。問題是,當我更新我的ViewModel時,當前的數據透視項和右側的數據透視項被更新。但是左側的透視項(不在屏幕上)未更新。向左拖動時可能會遇到此問題。如何解決這個問題? – onmyway133

0

請考慮使用custom handling of flicking left/right代替,然後隨時更新內容。通過動畫,您可以模擬轉場。

我曾經用這種方式創建過漫畫閱讀器。這非常簡單,並且不會影響性能。

+0

我該如何模擬像pivot這樣的動畫? – onmyway133