【发布时间】:2013-02-24 21:41:58
【问题描述】:
我有一个来自 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 又出现了,需要相当长的时间。
我做错了吗?
【问题讨论】:
-
究竟是什么意思“我注释掉了整个覆盖”。它是一个空主体的 MeasureOverride,还是根本没有 MeasureOverride?span>
-
我删除了我的答案,因为它更像是评论而不是答案。无论如何,有趣的问题,请提供更多信息。 “按钮在调出下一个屏幕之前花了很长时间。”下一个屏幕到底是什么? WrapPanel 是您的下一个屏幕,对吗?绘制/加载它需要太长时间?您认为这是性能缓慢的自定义度量逻辑错误吗?您是否也覆盖了排列方法?您能告诉我们您看到 GroupWrapPanel 的秒数吗?
-
@Clemens: "我注释掉了整个覆盖" => 根本没有方法。
-
@hedgehog:该应用由具有硬编码项目的 ViewModel 和显示(测试)数据的 View 组成。该应用程序不包含真正的逻辑,只是硬编码的虚拟数据。我使用 Caliburn.Micro 进行 ViewModel-View 匹配和 Conductor-Screen 导航。该按钮导航到新屏幕。该按钮保持黑色一段时间(大约一秒钟,不到两秒钟),然后显示新屏幕。我使用 StopWatch 来测量 Caliburn 以毫秒为单位 (
-
于是我启动了分析器。我没有覆盖 Arrange 方法,只是 Measure(我只需要限制 WrapPanel)。我确实完全删除了我的逻辑——只留下一个呼叫基地。这仍然显示在性能结果中。
标签: wpf performance wpf-controls custom-controls