2

在我的 WPF 工作中有一个 ListBox 有大量的 ItemSource(Observablecollection,超过 400000,包括图片,字符串等),每次运行它,加载 ListBox 都需要很多时间和空间。有什么好的解决办法来处理吗?

4

1 回答 1

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 万个数据集......

于 2013-09-30T08:49:57.767 回答