我正在尝试为分层控件实现虚拟化集合,类似于this article中提供的常规控件的集合控件。
文章中提出的解决方案在很大程度上依赖于以下行为(来自文章):
当
ItemsControl
绑定到IList
实现时,而不是。{ 一个IEnumerable
实现,它不会枚举整个列表, 而只是访问显示所需的项目。它使用了Count
属性来确定集合的大小,大概是为了 设置滚动范围。然后它将遍历屏幕 使用列表索引器的项目。因此,可以创建IList
可以报告有大量项目,但实际上只有 在需要时检索项目。
我发现虽然ListBox
有这种行为,但TreeView
(也是ItemsControl
)的行为并不像这样,所有项目总是被请求,无论是否或不是它们会显示在屏幕上。
那么,这是针对ListBox
而不是针对每个ItemsControl
的特定行为,还是WPF TreeView
中的错误?
我也无法在MSDN上找到任何关于此行为的提及,所以如果有人发现它记录在任何我想知道的地方。
答案 0 :(得分:0)
虚拟化ItemsControl
除了使用VirtualizingStackPanel
或设置VirtualizingStackPanel.IsVirtualizing="True"
以下是所需代码的重要部分,但请参阅this question以获得更完整的答案
<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>