我在 XAML 中有一个具有多层的 TreeView
。使用this solution我可以获得每个不同层的 XAML 配置外观,并确认它是 UI 虚拟化。
但是,当我将特定层的 VirtualizingStackPanel
切换为具有不同的 Orientation
时(通过类似 this solution 的代码,或使用 Snoop 都无关紧要) ) 而不是其父级,然后 UI 虚拟化关闭,TreeView
在我展开该层后立即实现所有 TreeViewItem
。
在研究此行为时,我注意到在 VirtualizingStackPanel
的引用源中,当您深入研究其 MeasureOverride
函数时,您会发现 this comment on line 2116 :
Compute if this panel is different in orientation that (sic) either its parent or descendents
看来 Microsoft 有意为此案例禁用了 UI 虚拟化。所以我有两个问题:
- 为什么层与层之间的方向一致性很重要?
- 如何让 UI 虚拟化与具有不同方向的
TreeView
一起工作?
最佳答案
UI 虚拟化依赖于正确测量视口(viewport)和应该在 View 中的内容的能力。一般而言,如果您在一个维度上滚动类似列表的结构(将 TreeView 视为就渲染而言的缩进列表),则效果很好。如果您突然需要在二维中计算它,则效果不佳,具体取决于您正在渲染的子项。想一想如果其中一个水平方向的 child 比其他 child 高,但当前在屏幕上不可见,算法必须解决什么问题——它如何在不计算布局的情况下确定下一个垂直方向的 child 是否应该在 View 中对于所有这些 child ,从而破坏了虚拟化的目的?
关于c# - 具有不同方向的 WPF 虚拟化 TreeView 不虚拟化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42911247/