WPF で ListBox を仮想化して実装しているつもりが出来ていなかったというお話。
ダメコード
<ListBox
HorizontalAlignment="Stretch"
ItemsSource="{Binding Hoge}"
MaxHeight="600"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
このコードで実行したところ、描画が非常に遅くなった。
OKコード
<ListBox
HorizontalAlignment="Stretch"
ItemsSource="{Binding Hoge}"
MaxHeight="600"
ScrollViewer.CanContentScroll="True"
ScrollViewer.VerticalScrollBarVisibility="Visible"
VirtualizingPanel.IsVirtualizing="True"
VirtualizingPanel.VirtualizationMode="Recycling"
>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
どこが違うか分かりましたか?
VirtualizingPanel のプロパティを指定しているのに、通常の StackPanel を使用していました。
これでは仮想化はされません。
OKコードでは、『VirtualizingStackPanel』を使っています。これで仮想化されるようになります。
コメント