1

我正在尝试将 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 默认包含的内容相同。但是虚拟化不起作用。我在这里阅读了几篇文章和几个答案,但仍然无法弄清楚“一般方式” - 我必须在哪里设置、绑定、添加等以使虚拟化与自定义模板一起工作?

4

2 回答 2

2

两件事情:

更新您PanelTemplate以使用 aVirtualizingStackPanel并将您的virtualization选项添加ScrollViewerControlTemplate.

<ListBox.Template>
    <ControlTemplate>
        <ScrollViewer VirtualizingStackPanel.IsVirtualizing="True"
                      VirtualizingStackPanel.VirtualizationMode="Recycling">
            <ItemsPresenter />
        </ScrollViewer>
    </ControlTemplate>
</ListBox.Template>

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

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

于 2015-02-05T21:42:00.207 回答
2

原因是您使用的是 a -StackPanelItemsPanel应该使用 aVirtualizingStackPanel代替(这也是 ListBox 的默认 ItemsPanel)。

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

<ListBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />
    </ItemsPanelTemplate>
</ListBox.ItemsPanel>
于 2015-02-05T21:21:37.633 回答