在我的WPF工作中有一个包含大量ItemSource(Observablecollection,超过400000,包括图片,字符串等)的ListBox,并且我一直运行它,加载ListBox需要很多时间和空间。有没有什么好的解决方案可以解决它?
答案 0 :(得分:3)
只需处理问题的UI和WPF特定位:您需要虚拟化ListBox,这意味着不是将完整的“ItemsSource”加载到控件中,而是仅加载当前显示的部分(加上当用户向下滚动时要准备一点)。 WPF ListBox支持虚拟化,使用'VirtualizingStackPanel'附加属性。
这是一个原则上显示用法的代码段:
<ListBox ItemsSource="{Binding Items}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
</ListBox>
如果您对此主题进行一些研究,您会发现许多资源可以指导您如何正确实施虚拟化。
话虽如此,上面只涉及性能问题的UI渲染位。您用作“ItemsSource”的项目列表仍将完全加载到幕后,因为这与WPF无关。有了400k的数据集,包括图像(比如每个500k),你需要的内存比任何标准机器都要多。实际上我很惊讶它一直在工作,但这在很大程度上取决于图像的大小。无论如何,将数据量加载到内存中的方法远非可扩展。考虑一下这里的重新设计,一次加载您需要的位并使用虚拟化显示它们。没有用户会一次处理50万个数据集......