據我所知,ListBox
應用組時仍停止項目的虛擬化。
無論是2000項目將充分履行將取決於應用到每個項目模板的複雜性。我有一個ListBox
與一個相對簡單的模板(大約8 TextBlock
s在水平StackPanel
)和性能開始退化在約1500項應用分組。它也似乎取決於項目聚合到的組的數量,其中更多的組導致更少的性能。這在滾動出於某種原因時尤其明顯。
ListBox
使得動態分組很容易,但如果你平時要通過專輯來分組的,那麼它可能會更好設置你ItemsControl
的ItemsSource
(也許ListBox
)是Album
對象的集合,每個其中有一個Tracks
屬性,該屬性本身就是對象集合Track
。假設這個,我看到兩個選項:
- 使用在
Album
DataTemplate
- 使用嵌套
ItemsControls
一個HeaderedItemsControl
如TreeView
與HierarchicalDataTemplate
在選擇一個,你必須手動管理選項。在最簡單的實現中,您可以分別選擇專輯和曲目;潛在地選擇了不屬於所選專輯的曲目。您可能無需選擇專輯,因爲這不是我能想到的其他媒體播放器的曲目列表視圖中呈現的概念。
解決方案一對於從一張專輯的最後一首歌曲到下一張專輯的第一首歌曲的鍵盤導航也有影響。
假設下面的代碼:
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>
變化外ListBox
到ItemsControl
緩解選擇問題,因爲討論。你不得不使它看起來很漂亮,雖然上面看起來很醜。
選擇二可以被定義如下:
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以來已經過時。
同意,虛擬化w/group by時,您不能真正允許豐富的數據模板。 –