WP7 ListBoxItem ContentPresenter测量时间

时间:2011-06-19 14:14:25

标签: silverlight windows-phone-7

希望有人可以帮助我或至少启发我一点。在Mango Beta工具发布之后,我使用新的WP7 Profiler玩了很多东西,有一件事让我烦恼。

每一个只有更复杂的项目的列表框都需要永远的绘制。例如,包含Border-> Grid-> 6xTextBoxes(每个显示单个符号)的项目的列表框每个列表框项目需要303ms。其中288ms用于ListBoxItem的ContentPresenter测量时间(不包括在内)。

我知道措施是一种昂贵的操作,但这仍然是疯狂的。任何想法将不胜感激。

2 个答案:

答案 0 :(得分:1)

我只能确认MeasureOverride是最耗时的操作。 (而且你不需要探查器就能找到它。)我只能猜到为什么需要这么长时间。

首先,MeasureOverride以递归方式遍历ListBoxItem的可视树。在这个调用链末尾的某个地方,可能会调用返回实际大小的本机代码。

因此,保持简单的项目结构至关重要。

您的结构似乎过于复杂。如果你看一下TextBox模板,你会发现它的结构是Grid>边界> ContentPresenter。我无法判断ContentPresenter的背后是什么,因为我不知道你的代码,我只是想知道你为什么不使用TextBlock(如果可能的话) - 它的效率更高。

作为一个实验,我会尝试实现MyListBoxItem.MeasureOverride并返回固定大小而不调用基本实现。我不知道它是否有效,但它可能会带来令人惊讶的结果。

在实施自己的列表项时,您可能会调查的第二件事是调用MeasureOverride的频率。 (或者只是查看分析器输出。)如果调用次数太多,则布局可能需要更多的循环。也许有一些冲突的尺寸要求需要几个步骤才能解决。

你提到了40个项目。这应该不起任何作用。 ListBox构造了大约3个ListBoxItem的屏幕,其余项目根据需要构建(最常重用)。如果通过增加项目编号来增加测量时间,则在数据实现中查找问题。

答案 1 :(得分:0)

  1. 确保您的数据在异步操作中完全加载,并且只在ListBox上添加项目在UI线程上运行

  2. 确保在模板中使用Grid而不是StackPanel

  3. 以下文章也非常有用:

    http://blogs.msdn.com/b/slmperf/archive/2010/10/06/silverlight-for-windows-phone-7-listbox-scroll-performance.aspx