WPF TreeView 虚拟化

标签 wpf virtualization

我试图弄清楚这个虚拟化功能,我不确定我是否理解错误或发生了什么,但我正在使用 ANTS 内存分析器来检查虚拟化 TreeView 中的项目数,它只是不断增加。我有一个包含 1,001 个项目(1 个根,1000 个子项目)的 TreeView,而且我总是得到多达 1,001 个 TreeViewItems、1,001 个 ToggleButtons 和 1,001 个 TextBlocks。虚拟化不应该重复使用这些项目吗?如果是这样,为什么我每个都有 1,001 个?此外, CleanUpVirtualizedItem 永远不会触发。

让我知道我是否理解错误以及您是否有有关如何使用它的资源。我在互联网上搜索过,但没有发现任何有用的东西。

编辑:

甚至树使用的内存也是从 aporx 增长而来的。当我展开并滚动浏览所有项目时,4mb 到 12mb。

让我知道谢谢。

这是我的代码。

XAML:

<Window x:Class="RadTreeViewExpandedProblem.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <TreeView x:Name="treeView"
                  VirtualizingStackPanel.IsVirtualizing="True"
                  VirtualizingStackPanel.CleanUpVirtualizedItem="TreeView_CleanUpVirtualizedItem">
            <TreeView.ItemsPanel>
                <ItemsPanelTemplate>
                    <VirtualizingStackPanel />
                </ItemsPanelTemplate>
            </TreeView.ItemsPanel>
        </TreeView>
    </Grid>
</Window>

C#:
 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            TreeViewItem rootItem = new TreeViewItem() { Header = "Item Level 0" };

            for (int i = 0; i < 1000; i++)
            {
                TreeViewItem itemLevel1 = new TreeViewItem() { Header = "Item Level 1" };

                itemLevel1.Items.Add(new TreeViewItem());

                rootItem.Items.Add(itemLevel1);
            }

            treeView.Items.Add(rootItem);
        }

        private void TreeView_CleanUpVirtualizedItem(object sender, CleanUpVirtualizedItemEventArgs e)
        {

        }
    }

最佳答案

区别在于 UI 虚拟化(WPF 开箱即用地支持各种控件)与数据虚拟化(WPF 不支持开箱即用)。

它归结为 UI 虚拟化只呈现需要的内容和 View ;而数据虚拟化仅在内存中保存给定时间可能需要的内容。

Bea 有两个关于 UI virtualization 的精彩帖子和 data virtualization并探讨差异以及如何解决不支持数据虚拟化的限制,这似乎是您所追求的。

编辑:

从 3.5 SP1 开始,TreeView 中添加了对虚拟化的支持。也许删除您的 ItemsPanel 模板并仅在 TreeView 上设置属性就足够了。

关于WPF TreeView 虚拟化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4549209/

相关文章:

c# - 我如何通过两种方式将父 UIElement 绑定(bind)到附加属性?

WPF:将 VisualBrush 转换为绘图?

virtualization - 如何完全自动化无人值守的 virt-install?

linux - 使用 Citrix XenServer 设置 NAS

linux - 从原始文件创建虚拟机 - Proxmox

c# - 尝试更改 WPF 中绑定(bind)的 RadioButton 时的奇怪行为

wpf 处理事件

wpf - 如何通过重新定义的列表框模板使用 UI 虚拟化

C#:在计算机中创建虚拟驱动器

c# - 我可以在 WPF 中以同步方式使用多个 BackgroundWorker 吗?