PR

[WPF][C#]ListBox仮想化してるつもりが出来てなかった

C#

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』を使っています。これで仮想化されるようになります。

コメント

タイトルとURLをコピーしました