只是重写MeasureOverride会影响性能?

时间:2013-03-09 09:49:48

标签: wpf performance wpf-controls custom-controls

我有一个来自WrapPanel的派生类,它覆盖了MeasureOverride方法。我正在构建我的应用程序的骨架/原型,首先做视图模型和视图以获得屏幕流程等的概念,也让其他人提供有关设计的反馈。所以它是一个非常轻量级的应用程序。

我注意到在启动下一个屏幕之前点击一个特定的按钮花了很长时间,所以我描述了应用程序(采样)。在Startup方法旁边,MeasureOverride是占用时间最多的单一方法。这是我的代码:

public class GroupWrapPanel : WrapPanel
{
    public const double ItemSize = 120.0;

    protected override Size MeasureOverride(Size availableSize)
    {
        var numberOfRows = (availableSize.Height / ItemSize);
        var numberOfCols = (Children.Count / numberOfRows) + 1;

        var newSize = new Size(numberOfCols * ItemSize, availableSize.Height);

        return base.MeasureOverride(newSize);
    }
}

所以我注释掉了整个覆盖,现在它执行得很快 - MeasureOverride不在大多数时间占用的方法列表中。我刚刚放入一个覆盖,除了调用基类之外什么也没做。现在,MeasureOverride又在那里,耗费了相当长的时间。

我做错了吗?

1 个答案:

答案 0 :(得分:1)

如果你建议这样:

protected override Size MeasureOverride(Size availableSize)
{
    return base.MeasureOverride(newSize);
}

导致显着放缓,这似乎不太可能。如果您真的使用和不使用琐碎的覆盖进行配置并注意到不同的结果,我认为您最有可能在您的探查器上有“仅我的代码”或类似的设置,或者您已经过滤,以至于您没有看到当您看到WrapPanel.MeasureOverride时,费用为GroupWrapPanel.MeasureOverride

小组的措施是否确实占用了大量时间是另一回事,但是可信 - 我建议在调用树中挖掘并查找调用的内容,您可能会发现某些子项目的测量成本很高。