我在 XAML 中有一个带有多层的 TreeView。使用 this solution 我可以获得每个不同层的 XAML 配置外观,并确认它是 UI 虚拟化。

但是,当我将特定层的 VirtualizingStackPanel 切换为具有不同的 Orientation 时(无论是通过 this solution 之类的代码还是使用 Snoop 之类的代码都没有关系)而不是其父级,那么 UI 虚拟化会关闭并且 TreeView 会尽快实现所有 TreeViewItem s我展开那一层。

在研究这种行为时,我注意到在 VirtualizingStackPanel 的引用源中,当您深入了解其 MeasureOverride 函数时,您会发现 this comment on line 2116 :



在这种情况下,微软似乎有意禁用了 UI 虚拟化。所以我有两个问题:

  • 为什么层之间的方向一致性很重要?
  • 如何让 UI 虚拟化与其中具有不同方向的 TreeView 一起工作?
  • 最佳答案

    UI 虚拟化依赖于正确测量视口(viewport)和应该在 View 中的内容的能力。一般来说,如果您在一个维度上滚动以获取类似列表的结构(将树 View 视为,例如,就渲染而言,缩进列表),则效果很好。如果您突然必须在二维中计算它,这也不会奏效,这取决于您渲染的 child 。想想如果这些水平方向的 child 之一比其他 child 高,但当前在屏幕上不可见,算法必须解决什么问题 - 它如何在不计算布局的情况下确定下一个垂直 child 是否应该在视野中对于所有这些 child ,从而破坏了虚拟化的目的?

    关于c# - 具有不同方向的 WPF 虚拟化 TreeView 不会虚拟化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42911247/

    10-13 03:23