2

我正在尝试为分层控件实现一个虚拟化集合,类似于本文中介绍的常规控件。

文章中提出的解决方案在很大程度上依赖于以下行为(来自文章):

当 anItemsControl绑定到一个IList实现而不是一个IEnumerable实现时,它不会枚举整个列表,而只会访问显示所需的项目。它使用该 Count属性来确定集合的大小,大概是设置滚动范围。然后它将使用列表索引器遍历屏幕上的项目。因此,可以创建一个IList 可以报告有大量项目的报告,但仅在需要时才实际检索这些项目。

我发现 whileListBox有这种行为,TreeView(这也是一个ItemsControl)的行为不是这样的,并且总是请求所有项目,无论它们是否显示在屏幕上。

那么,这是仅针对ListBox而不是针对每个人的行为,ItemsControl还是 WPF 中的错误TreeView

我也无法在 MSDN 上找到有关此行为的任何提及,因此如果有人发现它记录在任何我想知道的地方。

4

1 回答 1

0

虚拟化 anItemsControl不仅仅是使用 aVirtualizingStackPanel或设置VirtualizingStackPanel.IsVirtualizing="True"

这是所需的重要代码位,但请参阅此问题以获得更完整的答案

<ItemsControl
    VirtualizingStackPanel.IsVirtualizing="True" <!-- needed -->
    ScrollViewer.CanContentScroll="True" <!-- needed -->
    ... >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel /> <!-- needed -->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer>  <!-- needed -->
                <ItemsPresenter  />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>
于 2012-07-23T18:53:19.037 回答