WPF 虚拟树视图中的滚动错误

2023-11-30

我在 WPF 中使用虚拟化树视图来显示具有大量子节点(5000+)的 3 级深度层次结构。

<TreeView Grid.Row="0" Grid.Column="0" Name="TestTree"  ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="True">
...
</TreeView>

发生的情况是,如果我展开第三层的子节点并滚动到最后,内容将无法正确显示,并且滚动器“翻转回来”,我可以继续向下滚动,在更多滚动后重复该行为。

这种情况仅发生在虚拟化模式下,但不幸的是,由于子节点数量较多,非虚拟化模式下树视图的加载时间令人望而却步。

我已阅读以下链接here以及 MSDN 论坛上的原始帖子here但建议的解决方法是调用UpdateLayout()在 SelectedItemChanged 处理程序中对我不起作用。

以前是否有其他人经历过这种奇怪的行为,如果有的话有解决方法吗?

感谢任何意见 - 谢谢!


您是否尝试过惰性加载项目?我的意思是,您可以首先(不虚拟化)仅加载根节点,然后当每个节点展开时加载它的子节点。

在这种情况下,我通常使用 TreeViewItemViewModelClass,例如:

public class TreeViewItemViewModel : INotifyPropertyChanged
{
    public IEnumerable<TreeViewItemViewModel> Childs { get; }
    public bool IsSelected { get; set; }
    public bool IsExpanded { get; set; }
    (...)
}

然后在具有 TwoWay 绑定的 TreeView 的 ItemContainerStyle 中绑定 IsSelected 和 IsExpanded 属性,然后在属性 IsExpanded 的 setter 中加载其所有子项。

我已经测试了这种方法,树理论上有超过 5000 个项目,但从未同时加载所有项目。

希望这可以帮助...

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

WPF 虚拟树视图中的滚动错误 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

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

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • Git GPG 签名错误签名

    我正在尝试在我的 Mac 上启用 gpg 提交签名 我已经成功签署了一项提交 然后尝试再次执行 但从那以后我无法让它再次正常工作 每次它都会说 签名错误 即使密钥 ID 相同 我通常可以毫无问题地签署常规文本文件等 git 是唯一一个做出如
  • PreferenceActivity 中正确的 RadioGroup

    是否可以在 PreferenceActivity 中定义 RadioGroup 我只能在提供多项选择时找到ListView 我错过了什么吗 欢迎您延长any Preference班级 我通过扩展做了你正在寻找的事情PreferenceCat
  • 如何在 VBA 中以编程方式在某些工作表单元格数据旁边添加按钮?

    我有一个函数可以生成 100 行 和 2 列 的数据 对于每一行 在第三列中 我需要添加一个按钮 单击该按钮时 会弹出一个自定义模式对话框 为用户提供 4 个选项 按钮可供选择 知道如何做到这一点吗 我认为这足以让你走上一条美好的道路 Su
  • 将属性添加到数据存储后,如何向 EntityType 添加属性?

    我有一个实体框架代码优先模型 其中有一列未映射 我仍然希望在服务器和客户端之间保留该列 该模型看起来与此类似 但具有更多属性 public class OwnerInformation Key DatabaseGeneratedAttrib
  • python 请求中的 OpenSSL 错误

    在带有 OpenSSL 版本 1 1 1i 和 pyopenssl 版本 1 1 1i 的 arch linux 上运行 python 版本 3 9 1 当尝试将 https 代理与 requests 模块一起使用时 出现以下错误 Trac
  • Excel 中的混合数据类型,IMEX 不起作用

    我正在尝试将 xls 导出到数据表中 下面是我的连接字符串 string path xls source path OleDbConnection MyConnection new OleDbConnection provider Micr
  • 如何使程序的第二个实例将控制权传递回第一个实例?

    我已经用 Delphi XE3 创建了一个应用程序 我的应用程序有一个托盘图标 我为此使用 TCoolTrayIcon 因此当用户最小化它时 任务栏上没有图标 而仅在托盘图标上 为了避免我的应用程序出现多个实例 我使用以下代码 proced
  • 停止运行“worksheet_change”或 worksheet_calculate

    我有一张包含大量代码的工作表 该代码中有 worksheet change 和 worksheet calculate 函数 在某些过程中 在处理此工作表时 有时会不必要地运行此代码 是否有一行代码会阻止运行 worksheet chang
  • 将命令应用于所有提交

    为了收集有关 Git 存储库的一些统计信息 我正在寻找一种方法来执行以下操作 对于每个提交 执行一个命令 例如 du h 该命令应该在提交后从存储库基目录 按照它看起来的样子 运行 理想情况下 该命令可以访问提交哈希值和时间戳 一个用准 B
  • 如何从脚本本身获取 Bash 脚本所在的目录?

    如何获取某个目录的路径Bash脚本位于 inside那个脚本 我想使用 Bash 脚本作为另一个应用程序的启动器 我想将工作目录更改为 Bash 脚本所在的目录 这样我就可以对该目录中的文件进行操作 如下所示 application usr
  • findViewById 未定义

    Eclipse 将 findViewById int 标记为未定义 它对 getResources 做了同样的事情 但我能够通过调用 context getResources 来解决这个问题 如下所示 并且似乎无法为 findViewByI
  • 如何在android中的canvas中添加3张图片

    我有 3 张图像 我想将它们依次添加到画布上 这是我的代码 public void onCreate Bundle savedInstanceState super onCreate savedInstanceState setConten
  • Xcode 10 似乎破坏了 com.apple.commcenter.coretelephony.xpc

    我已经升级到Xcode 10 on High Sierra现在激励广告示例项目来自 AdMob 的投诉com apple commcenter coretelephony xpc工作不正常 是否有我必须启用的新权利 我搜索了几个小时却没有任
  • 按两个属性对对象数组进行排序

    我有一个对象数组 我想按两个属性进行排序 提醒时间戳 修改时间戳 排序顺序 desc 按一个属性对这个对象进行排序不是问题 但在这种情况下我不知道如何让它工作 假设时间戳本身排序正常 例如 ISO8601 和相同时区 请尝试 myArray
  • 如何使用 Apple Symbols 字体中的字形?

    我想在我的应用程序中使用 Apple Symbols 字体中的一种字形 我在CharactersPallete 来自Snow Leopard 中打开这个字体 这个字形的 锁符号 id GID 是5003 它不是字形的unicode编号 如何
  • ShellExecuteEx 在 Excel VBA 中崩溃

    由于 Windows 更新发生 API 调用ShellExecuteEx sExecuteInfo 崩溃 说 0x75F7A529 处未处理的异常 shell32 dll 访问冲突 读取位置0x68686903 我不知道这里出了什么问题 你
  • 与 Tkinter 跟踪相关的回调函数有哪些限制?

    我试图弄清楚如何实现一个回调函数 它可以做一些比打印输出更有意义的事情 我相当缺乏经验 所以我不确定回调函数应该或可以如何在Python 或任何其他语言 中实现 考虑以下 Python 代码 from Tkinter import def
  • 前台本地通知

    在警报中 通知在后台工作正常 如下所示 UILocalNotification notification1 UILocalNotification alloc init notification1 fireDate alramtime no
  • Wordpress 管理面板上的 jQuery 错误(tinyMCE 未定义)

    将 Wordpress 从 3 2 升级到 3 5 后 我在管理端收到 jQuery 错误 下面是错误 Error ReferenceError tinyMCE is not defined Source File http domainn
  • WPF 虚拟树视图中的滚动错误

    我在 WPF 中使用虚拟化树视图来显示具有大量子节点 5000 的 3 级深度层次结构