内部具有不同方向的WPF虚拟化TreeView不虚拟化?

我在XAML中有一个包含多个图层的TreeView 。 使用此解决方案,我可以为每个不同的层获取XAML配置的外观,并确认它是UI虚拟化。

但是,当我将特定图层的VirtualizingStackPanel切换为具有不同的Orientation (无论是通过此解决方案的代码,还是使用Snoop无关紧要)时,UI虚拟化将关闭, TreeViewItem将尽快实现所有TreeViewItem随着我扩展该层。

在研究这种行为时,我注意到在您进入MeasureOverride函数时,在VirtualizingStackPanel的参考源中,您可以在第2116行找到此注释 :

如果此面板的方向不同(sic)其父级或后代,则进行计算

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

  • 为什么层之间的方向一致性很重要?
  • 如何让UI虚拟化与具有不同方向的TreeView一起使用?

UI虚拟化依赖于正确测量视口和应该在视图中的内容的能力。 一般来说,如果你在一个维度上滚动类似列表的结构(考虑到树视图,就像渲染那样的缩进列表),那么效果很好。 如果您突然必须在两个维度上计算它,这取决于您正在渲染的孩子,它也不会有效。 如果其中一个水平导向的孩子比其他孩子高,但目前在屏幕上看不到,那么想想算法必须解决的问题 – 如何在不计算布局的情况下确定下一个垂直孩子是否应该在视野中对于所有这些孩子,从而挫败了虚拟化的目的?