c# - 具有不同方向的 WPF 虚拟化 TreeView 不虚拟化?

标签 c# wpf xaml treeview ui-virtualization

我在 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/

相关文章:

c# - 在自定义控件中交换 ContentPresenter 内容

c# - 我可以通过编程方式向 XAML 添加元素吗? WPF C#

c# - 通过线程将表单显示为另一个表单上的对话框

wpf - 如何使用 mahapps api 使用 ShowMetroDialogAsync()

c# - 如何在运行时在 Xamarin.Forms 中动态添加输入字段

c# - Windows 8 C# : Windows. Ui.Xaml.Media.ImageSource 更改图像

c# - 每秒刷新标签内容 WPF

WPF ListBox 与 CheckBoxes : select the checkbox before checking it

c# - SQL选择两个userID作为不同的别名

c# - 为应用程序提供提升的 UAC