防止在测量阶段调用 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(...) <-- 贵!

防止在测量阶段调用 ApplyTemplate()

我不确定您在特定情况下是否能够避免ApplyTemplate()调用,但您不需要这样做。 WPF TreeView具有对 UI 虚拟化的内置支持:

<TreeView VirtualizingStackPanel.IsVirtualizing="True" />

查看此页面以获取更多信息。

如果你还没有解决这个问题,我有一个想法,我没有尝试过: 也许您可以编写自己的面板来包含树项,您将在其中覆盖 MeasureOverride ,这样它就不会从包含的元素中获取测量值,而是自己进行计算?