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

时间:2013-09-18 20:50:27

标签: c# wpf windows .net-4.0

我目前正在为我正在处理的应用程序创建虚拟化TreeView控件。我目前的实现依赖于优化的测量算法,这给我一些问题。在我进入详细信息之前,请注意我使用的是.NET 4.0版。

我为优化内部 TreeView 控件的测量所做的工作是最大限度地减少 MeasureOverride()功能中的工作。我已经把它归结为最基本的东西,而我现在剩下的就是WPF内容深处的昂贵电话。基本上在控件上调用 Measure()会应用子控件上的所有模板,这非常昂贵。由于我的TreeViewItems都具有已定义的高度,因此在测量阶段我并不需要模板。有没有人知道绕过 ApplyTemplates()电话的方法?

这是一个示例调用堆栈

  • MyCustomControl.MeasureOverride(...)
    • ...
      • UIElement.Measure(...)
        • FrameworkElement.MeasureCore(...)
          • FrameworkElement.ApplyTemplate(...)< - 贵!

2 个答案:

答案 0 :(得分:0)

我不确定您是否能够在特定情况下避免ApplyTemplate()来电,但您不应该这样做。 WPF TreeView内置了对UI虚拟化的支持:

<TreeView VirtualizingStackPanel.IsVirtualizing="True" />

查看this page了解详情。

答案 1 :(得分:-1)

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