具有不同方向的 WPF 虚拟化 TreeView 不虚拟化?
WPF Virtualized TreeView with different orientations within doesn't virtualize?
我在 XAML 中有一个 TreeView
有多层。使用 this solution 我可以获得每个不同层的 XAML 配置的外观,并确认它是 UI 虚拟化。
但是,当我将特定层的 VirtualizingStackPanel
切换为与其父层不同的 Orientation
(是否通过 this solution, or with 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 虚拟化依赖于正确测量视口和应在视图中的内容的能力。一般来说,如果您在一个维度上滚动 list-like 结构(将树视图视为就渲染而言的缩进列表),则效果很好。如果您突然不得不在二维中计算它,则效果不佳,具体取决于您正在渲染的child。想一想如果其中一个水平方向 children 比其他方向高,但当前在屏幕上不可见,算法必须解决什么问题 - 它如何确定下一个垂直方向 child 是否应该如果不计算所有这些 children 的布局,是否在视图中,从而破坏虚拟化的目的?
我在 XAML 中有一个 TreeView
有多层。使用 this solution 我可以获得每个不同层的 XAML 配置的外观,并确认它是 UI 虚拟化。
但是,当我将特定层的 VirtualizingStackPanel
切换为与其父层不同的 Orientation
(是否通过 this solution, or with 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 虚拟化依赖于正确测量视口和应在视图中的内容的能力。一般来说,如果您在一个维度上滚动 list-like 结构(将树视图视为就渲染而言的缩进列表),则效果很好。如果您突然不得不在二维中计算它,则效果不佳,具体取决于您正在渲染的child。想一想如果其中一个水平方向 children 比其他方向高,但当前在屏幕上不可见,算法必须解决什么问题 - 它如何确定下一个垂直方向 child 是否应该如果不计算所有这些 children 的布局,是否在视图中,从而破坏虚拟化的目的?