2009-08-28 42 views
1
分組方式,專輯曲目列表

現在我知道,我可能需要使用一個列表框,可以使用的完全100%符合我的需求GroupStyle東西。唯一的一點是,我被告知:我要顯示WPF

「每當在控件上設置」GroupStyle「時,佈局項目的面板從VirtualizingStackPanel更改爲StackPanel(這是MS代碼中的黑客攻擊)。 」

我將需要最多可顯示使用該mecahnism 2000首曲目:

1)請問這個錯誤還存在嗎?

2)這是2000多首歌曲需要擔心的問題嗎? (更多類似的平均50-100)

此外,組由將不會由用戶改變。在整個控制過程中,曲目將以相同的方式分組。

回答

0

據我所知,ListBox應用組時仍停止項目的虛擬化。

無論是2000項目將充分履行將取決於應用到每個項目模板的複雜性。我有一個ListBox與一個相對簡單的模板(大約8 TextBlock s在水平StackPanel)和性能開始退化在約1500項應用分組。它也似乎取決於項目聚合到的組的數量,其中更多的組導致更少的性能。這在滾動出於某種原因時尤其明顯。

ListBox使得動態分組很容易,但如果你平時要通過專輯來分組的,那麼它可能會更好設置你ItemsControlItemsSource(也許ListBox)是Album對象的集合,每個其中有一個Tracks屬性,該屬性本身就是對象集合Track。假設這個,我看到兩個選項:

  1. 使用在AlbumDataTemplate
  2. 使用嵌套ItemsControls一個HeaderedItemsControlTreeViewHierarchicalDataTemplate

在選擇一個,你必須手動管理選項。在最簡單的實現中,您可以分別選擇專輯和曲目;潛在地選擇了不屬於所選專輯的曲目。您可能無需選擇專輯,因爲這不是我能想到的其他媒體播放器的曲目列表視圖中呈現的概念。

解決方案一對於從一張專輯的最後一首歌曲到下一張專輯的第一首歌曲的鍵盤導航也有影響。

假設下面的代碼:

public class Album 
{ 
    public string Title { get; set; } 
    public ObservableCollection<Track> Tracks { get; set; } 
} 

public class Track 
{ 
    public string Title { get; set; } 
} 

_tracks.ItemsSource = new[] { 
    new Album { 
     Title = "Album 1", 
     Tracks = new ObservableCollection<Track> { 
      new Track { Title = "Track 1" }, 
      new Track { Title = "Track 2" } 
     } 
    }, 
    new Album { 
     Title = "Album 2", 
     Tracks = new ObservableCollection<Track> { 
      new Track { Title = "Track 1" }, 
      new Track { Title = "Track 2" } 
     } 
    } 
}; 

下面是一些代碼演示選項之一:

<ListBox x:Name="_tracks"> 
    <FrameworkElement.Resources> 
     <DataTemplate DataType="{x:Type local:Track}"> 
      <TextBlock Text="{Binding Path=Title}" /> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:Album}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Path=Title}" /> 
       <ListBox ItemsSource="{Binding Path=Tracks}" /> 
      </StackPanel> 
     </DataTemplate> 
    </FrameworkElement.Resources> 
</ListBox> 

變化外ListBoxItemsControl緩解選擇問題,因爲討論。你不得不使它看起來很漂亮,雖然上面看起來很醜。

選擇二可以被定義如下:

VirtualizingStackPanel.IsVirtualizing="True" 

衣Stollnitz對本threegreatposts

<TreeView x:Name="_tracks2"> 
    <FrameworkElement.Resources> 
     <DataTemplate DataType="{x:Type local:Track}"> 
      <TextBlock Text="{Binding Path=Title}" /> 
     </DataTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type local:Album}" 
            ItemsSource="{Binding Path=Tracks}"> 
      <TextBlock Text="{Binding Path=Title}" /> 
     </HierarchicalDataTemplate> 
    </FrameworkElement.Resources> 
</TreeView> 

ListView經由XAML屬性支持選擇在UI虛擬化作爲3.5SP1話題,但她指出自SP1以來已經過時。

0

這不是一個錯誤......它是由設計!

+0

同意,虛擬化w/group by時,您不能真正允許豐富的數據模板。 –