如何解决wpf treeview内存消耗?

如何解决wpf treeview内存消耗?,wpf,memory,treeview,Wpf,Memory,Treeview,我有一个应用程序可以将所有xml标记加载到树视图中进行显示?问题是,我的xml包含数千个标记,占用了大量内存。我在互联网上读到这是wpf树视图的一个缺陷。有人能帮我吗?wpf树视图控件已经提供了一种数据虚拟化形式,如中所述。这可以显示内存中已经保存的大量数据 基本上,您可以将和附加的属性添加到Treeview中。虚拟化堆栈面板仅创建和绑定屏幕上可见的项目: <TreeView Height="200" ItemsSource="{Binding Source={Stati

我有一个应用程序可以将所有xml标记加载到树视图中进行显示?问题是,我的xml包含数千个标记,占用了大量内存。我在互联网上读到这是wpf树视图的一个缺陷。有人能帮我吗?

wpf树视图控件已经提供了一种数据虚拟化形式,如中所述。这可以显示内存中已经保存的大量数据

基本上,您可以将和附加的属性添加到Treeview中。虚拟化堆栈面板仅创建和绑定屏幕上可见的项目:

<TreeView Height="200" 
        ItemsSource="{Binding Source={StaticResource dataItems}}"
        VirtualizingStackPanel.IsVirtualizing="True"
        VirtualizingStackPanel.VirtualizationMode="Recycling">

这并不能解决在内存中加载了数千条记录的情况。在这种情况下,是源数据导致了问题,而不是树视图本身。在这种情况下,真正的解决方案是,通过使用适当的过滤器,首先不要加载太多的项目。另一种选择是,当用户向下滚动太远时,在页面中加载数据


另一种选择是在用户扩展父节点时加载子节点,尽管这会引入令人讨厌的延迟

假设您没有加载数千个根级节点,请研究“延迟加载”。然后只加载需要显示/展开的级别。您还应该看看WPF虚拟化。@FrédéricHamidi实际上,更明智的选择是只在内存中加载数据的一个子集。数据虚拟化是网格和任何必须显示大量数据的控件的标准技巧,因为VB6(及更早版本)。@Panagiotis,是的,我知道。这是一个很好的列表控件解决方案(例如,标准listview控件的“虚拟模式”)。不过,它对树的用处不大,因为用户只需点击“全部展开”,您就可以回到原点了。您好,我尝试了您的代码,但出现了相同的问题,虚拟化似乎不起作用。虚拟化堆栈面板确实起作用,但它无法解决在不需要时加载数千项的问题。它解决了创建数千个treeview节点的问题,即使这些节点没有显示出来。而且,只有在使用数据绑定时,它才起作用。如果手动添加节点,则已绕过它。您需要发布treeview的XAML以及用于加载和绑定items@PanagiotisKanavos,实际上,如果我在TreeView中加载数千项,虚拟化就可以工作。如果没有
虚拟化
的话,我的应用程序的重量约为700 mb,而
虚拟化
的重量约为70-80 mb。所以,它确实有效。