WPF TreeView 虚拟化

2024-01-21

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

如果我理解错误以及您是否有关于如何使用它的资源,请告诉我。我在互联网上搜索过但没有找到任何有用的东西。

EDIT:

甚至树所使用的内存也是从 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 虚拟化仅渲染视图内所需的内容;而数据虚拟化仅在内存中保存给定时间可能需要的内容。

Bea 有两个很棒的帖子用户界面虚拟化 http://bea.stollnitz.com/blog/?p=338 and 数据虚拟化 http://bea.stollnitz.com/blog/?p=344并探讨差异以及如何解决不支持数据虚拟化的限制,这似乎正是您所追求的。

EDIT:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF TreeView 虚拟化 的相关文章

  • 如何将用户控件的属性绑定到 WPF 中同一控件的属性?

    在我的用户控件中 我有一个收款电话解决方案 public List
  • WPF DataGrid 验证错误?

    这可能是预期的功能 但对我来说它确实像是一个错误 我正在使用开箱即用的 WPF DataGrid 绑定到 ObservableCollection 和尝试使用一些验证规则来提供良好的用户反馈 不用说 问题多得我数不过来 但我会坚持眼前的问题
  • C# WPF 如何正确关闭新窗口?

    我有一个简单的问题 1 创建一个新的WPF项目 其中有启动窗口 MainWindow xaml 2 在此项目中 创建一个新窗口Window1 xaml 3 Windows1的已加载事件 让它关闭 4 放置一个Open按钮到MainWindo
  • TextBlock:Text与StringFormat的绑定

    是否可以绑定Text and StringFormat too
  • 网格上的 SharedSizeScope 使表单“跳舞”

    我的页面上有一个 StackPanel 也尝试过使用 Grid
  • WPF 绑定中的“{Binding Path=.}”是什么意思?

    什么是 Binding Path 在 WPF 绑定中意味着什么 我看到有人用它 但找不到任何解释 绑定语法中是否还有其他特殊符号 除了 Binding 我找到了这个WPF 绑定备忘单 http www nbdtech com blog ar
  • 行为和视图模型在 MVVM 中如何关联?

    所以我在学习MVVM的时候偶然发现了一个问题 我有一个包含 TextBlock 的 TreeView 当我双击 TreeView 中的任何 TextBlock 时 我想对其执行操作 我开始学习行为 并且我有一个很好的示例来说明如何实现行为
  • tabControl/tabitem 刷新困难

    我有一个带有 maintabWindow 和几个 tabitem 的 WPF 窗口 它通常工作正常 布局是这样的 但是当我之前添加以下窗口时 结果是这样的 所以问题与 tabControl tabItem 刷新有关 这是相当明显的 但更重要
  • WPF - 在样式中使用 ControlTemplate 资源

    创建样式时 是否可以将 ControlTemplate 属性设置为先前定义的资源 例如 如果我在 ResourceDictionary 中有以下内容
  • WPF 组合框如果只有 1 项则自动选择

    我有一个组合框 我绑定到一个可观察的集合 它会发生变化 根据选择的公司 并且大量公司将有一个帐户 项目 因此我想知道制作组合框的最佳方法是什么如果 ItemsSource 中只有 1 个项目 则设置 SelectedItem 否则将其保留为
  • 如何将 ObservableCollection 绑定到 AvalonDock DocumentPaneGroup?

    我需要在 AvalonDock 2 0 中加载项目集合作为文档 这些对象继承自一个抽象类 我想根据哪个子类在文档中渲染一个框架 这是我的 XAML
  • 即使在 GC Collect 和 WaitForPendingFinalizers 之后,窗口对象在关闭后也未释放?

    这是一个简单的测试应用程序 可帮助了解 WPF 内存使用情况 我想了解的关键是为什么MainWindow即使在关闭并等待 GC 完成之后 仍然被引用并且它的内存没有被释放 参见下面的代码清单 文本 MainWindow Finalizer
  • 如何在 RichTextBox 中以编程方式移动插入符位置?

    我有一个 RichTextBox 其中的特殊文本位具有自定义格式 但是 存在一个错误 即插入字符后 插入符号会放置在新插入的字符之前而不是之后 这是因为对于每次编辑 代码都会重新计算内容以应用自定义格式 然后像这样设置 CaretPosit
  • 使 DataTemplate 可混合

    如何为 ViewModel 制作可混合的数据模板 可在表达式混合中设计 当我转到资源并尝试直接编辑数据模板时 我在绘图板上看到的只是一个空白矩形 这是因为 DataTemplate 没有绑定到任何东西 当然 我可以创建一个 UserCont
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • ItemSource 中具有不同类型数据的 ListView 多行列标题

    继续this https stackoverflow com q 26712051 1997232问题 我想实现这种ListView 它应该有两件事 多行列标题 不同的数据类型通过绑定ItemsSource以不同方式显示 为了解决 1 我尝
  • 窗口关闭后仍在调用方法

    首先我不知道这是不是一个愚蠢的问题 我有这样的场景 首先我有一个主窗口 public MainWindow InitializeComponent dt is a System Windows Threading DispatcherTim
  • 从 xaml 获取 RowIndex

    我有一个带有 DataGridTemplateColumns 的 DataGrid 在 TemplateColumn 中 我使用工作正常的 DataTrigger 它从 DataGrid 父级检索项目计数
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace

随机推荐

  • 尝试根据 mysql 保存用户应用程序时,WSO2 App Store 抛出错误

    当我尝试创建或编辑应用程序时 API Store 抛出错误 java sql SQLException Can t call commit when autocommit true 我添加了设置 init command set autoc
  • 与 Console.ReadLine() 相关的 RabbitMQ BasicConsume 和事件驱动问题

    下面的程序基本上是来自 C Rabbit MQ 教程中的 Receiver Worker 程序的程序 https www rabbitmq com tutorials tutorial two dotnet html https www r
  • Windows Phone 7 应用程序 - 方向更改

    各位开发者大家好 我正在开发一个 Windows Phone 7 应用程序 我无法弄清楚我认为对于经验丰富的人来说这是一个简单的问题 假设我有一个由两个元素组成的布局 一个列表框 填充了大量的项目 和一个文本块 为用户提供一些基本说明 当设
  • 什么是“表达问题”?

    我对这是什么有一个粗略的想法 但如果有人对 表达问题 有他们认为简洁直观的解释 我很想听听 Watch 这个想法是 您的程序是数据类型和对其进行操作的组合 该问题要求一种实现 允许添加类型的新情况和新操作 而不需要重新编译旧模块并保持静态类
  • Spring Bootrabbitmq连接超时问题

    我的 Spring Boot 应用程序抛出连接超时错误 并且永远无法连接 我看到的另一个有趣的问题是 它永远不会获取 Spring 应用程序属性中定义的连接超时属性 org springframework amqp AmqpTimeoutE
  • 将 Pivot xml 输出转换为不带 xml 的表格输出

    我有以下类型的表 ID Key Value 1 A aa 2 B bb 3 A ay 4 C cc 5 B bx 6 C ct 我需要输出 A B C aa bb cc ay bx ct 当我将 PIVOT 与子查询一起使用时 它不起作用
  • Scala / Dotty - 将特征混合到现有对象中

    有没有办法将特征混合到 Dotty 或 Scala 中的现有对象中 class SomeClass trait SomeTrait This works but it s not what I m looking for new SomeC
  • 在java中不使用任何循环打印1到10[重复]

    这个问题在这里已经有答案了 可能的重复 无循环或条件地显示从 1 到 100 的数字 https stackoverflow com questions 2044033 display numbers from 1 to 100 witho
  • 如何停止运行 Vim 宏

    我将一个宏记录到一个寄存器中 并以太多的重复次数开始它 完成每个宏需要很长时间 如何取消 停止 Vim 执行宏 有没有办法在不终止编辑器进程的情况下完成此操作 以下是我遵循的步骤 录制宏到寄存器1 我运行了1000次 1000 1 现在等待
  • C# 4.0中OptionalAttribute和可选参数有什么区别

    我正在研究别人的代码 有一个这样的方法 public SomeClass DoSomething string param1 Optional DefaultParameterValue string optional 为什么有人会使用这些
  • 本地化字符串比较

    有什么区别NSString s localizedCaseInsensitiveCompare and localizedStandardCompare 方法 我阅读了参考资料 但不知道该使用哪一个 localizedCaseInsensi
  • PHP OOP 数据库问题

    我正在使用 DB 类中的 get 函数从数据库查询用户名 即使数据库中存在用户 它也总是返回 无用户 这是我的 DB php
  • 如何旋转 ImageView?

    我想在我的 Activity 中以编程方式旋转 ImageView 目前我找不到任何适用于 Xamarin 的解决方案 并且 Android 的翻译解决方案也不起作用 有人知道如何旋转 ImageView 吗 例如 这段代码只是给了我一个
  • 如何在Android中使用Java邮件将应用程序电子邮件同步到服务器电子邮件?

    我想同步更改电子邮件应用程序中的更改 然后自动更改服务器电子邮件中的更改 例如 我已阅读电子邮件应用程序上的未读消息 然后自动服务器电子邮件将未读邮件更改为已读邮件 我的电子邮件应用程序使用邮件 jar 文件 activation jar
  • Airflow dags 生命周期事件

    我正在尝试通过java后端管理气流dags 创建 执行等 目前 在创建 dag 并将其放入气流的 dags 文件夹中之后 我的后端不断尝试运行 dag 但在气流调度程序接收到它之前它无法运行它 如果 dag 的数量较多 这可能需要相当长的时
  • Eslint:函数体括号的换行规则(类似于 object-curly-newline)?

    我希望函数体的括号有新行 const fn gt new line here new line before 同样适用于function We have https eslint org docs latest rules object c
  • 如何在elasticsearch启动时加载索引模板文件?

    在elasticsearch v1 5中 索引模板可以放置在templates目录下的配置位置 path conf 中elasticsearch config templates 但是 我发现升级到v2 3或v5 3后 这个模板将不会被加载
  • 获取Datalist中选定的项目值

    我在数据列表中使用 ImageButton 并希望将所选项目值存储在变量中以进一步处理它 如何在单击按钮时获取数据 我需要的数据是 Productid 名称 价格等 有什么帮助吗 数据列表的代码是
  • 具有单字母扩展名的 C++ 头文件有什么特别之处?

    C 标准在第 16 2 节 源文件包含 中包含以下规则 它以某种方式使单字符文件扩展名变得特殊 该实现应为由一个或多个组成的序列提供唯一的映射非数字 or digits 2 11 后跟一个句点 和一个单一的nondigit 第一个字符不能是
  • WPF TreeView 虚拟化

    我正在尝试弄清楚这个虚拟化功能 我不确定我是否理解错误或发生了什么 但我正在使用 ANTS 内存分析器来检查虚拟化 TreeView 中的项目数 并且它只是不断增加 我有一个包含 1 001 个项目 1 个根项目 1000 个子项目 的 T