如何在重新定义的ListBox模板中使用UI虚拟化

时间:2015-02-05 21:15:51

标签: wpf xaml listbox virtualization ui-virtualization

我正在尝试将ListBox用作包含多个项目的视图,当然,我需要在其中使用UI虚拟化。

问题是虚拟化仅在我以这种方式声明ListBox时才起作用:

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.VirtualizationMode="Recycling">

    <ListBox.ItemTemplate>
        <DataTemplate>
            <views:SiteEntryView />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

但如果我尝试自定义它,它就不再虚拟化了:

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.VirtualizationMode="Recycling">

    <ListBox.Template>
        <ControlTemplate>
            <ScrollViewer>
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
    </ListBox.Template>

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <views:SiteEntryView />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

据我所知,此示例包含默认情况下ListBox包含的内容。但虚拟化并不起作用。我在这里阅读了几篇文章和几个答案,但仍然无法弄清楚“一般方式” - 我必须设置,绑定,添加等的内容和位置,以使虚拟化与自定义模板一起工作?

2 个答案:

答案 0 :(得分:2)

原因是您为StackPanel使用ItemsPanel - 您应该使用VirtualizingStackPanel代替(这也是ListBox的默认ItemsPanel)。

删除ItemsPanel定义或修改它以使用VirtualizingStackPanel

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>

答案 1 :(得分:2)

两件事:

更新您的PanelTemplate以使用VirtualizingStackPanel并将virtualization个选项添加到ScrollViewer的{​​{1}}。

ControlTemplate