防止在测量阶段调用 ApplyTemplate()
本文关键字:调用 ApplyTemplate 段调用 测量 | 更新日期: 2023-09-27 18:32:04
我目前正在为我正在处理的应用程序创建虚拟化的 TreeView 控件。我目前的实现依赖于优化的测量算法,这给我带来了一些问题。现在,在我进入此处的详细信息之前,请注意我使用的是 .NET 版本 4.0。
我为优化内部 TreeView 控件的测量所做的是最大限度地减少在 MeasureOverride() 函数中所做的工作。我已经把它归结为最基本的东西,我现在剩下的是一个昂贵的电话,深入WPF的内心深处。基本上,在控件上调用 Measure() 会应用子控件上的所有模板,这真的很昂贵。由于我的 TreeViewItems 都将具有定义的高度,因此在测量阶段我实际上不需要模板。有谁知道绕过 ApplyTemplates() 调用的方法?
下面是一个示例调用堆栈
- MyCustomControl.MeasureOverride(...)
- 。
- UIElement.Measure(...)
- FrameworkElement.MeasureCore(...)
- FrameworkElement.ApplyTemplate(...) <-- 贵!
- FrameworkElement.MeasureCore(...)
- UIElement.Measure(...)
- 。
我不确定您在特定情况下是否能够避免ApplyTemplate()
调用,但您不需要这样做。 WPF TreeView
具有对 UI 虚拟化的内置支持:
<TreeView VirtualizingStackPanel.IsVirtualizing="True" />
查看此页面以获取更多信息。
如果你还没有解决这个问题,我有一个想法,我没有尝试过: 也许您可以编写自己的面板来包含树项,您将在其中覆盖 MeasureOverride ,这样它就不会从包含的元素中获取测量值,而是自己进行计算?