Windows Phone 7 ListBox只有几个项目的性能不佳?

时间:2011-01-25 16:41:08

标签: performance windows-phone-7 listbox

我正在编写一个简单的字典应用程序,可以在您键入时为单词提供建议。建议显示在ListBox中,每次查询更改时,都应显示约10条建议。

不幸的是,目前表现很低。结果出现几乎需要一秒钟,我不明白为什么。 EQATEC Profiler表明我的方法运行顺利。我通过在代码周围加Stopwatch来证实这一点。我还尝试了一些建议,并且性能会随着项目的减少而增加。

这使我得出结论,渲染ListBox(我认为在我的方法之外发生)是缺乏性能的原因。

  • 在ListBox中渲染10个项目的确需要超过250毫秒吗?
  • 如何在屏幕上快速输入少量字词?

编辑: 我填充ListBox的方式非常简单。这是正确的方式吗?

resultsListBox.Items.Clear();
foreach (string s in suggestions.Words)
{
  resultsListBox.Items.Add(s);
}
resultsListBox.SelectedIndex = suggestions.MatchIndex;

你在这里看到的确是它:默认的ListBox,String项,没有模板。我是否违反了其中一个原则?

  • 确保您将项目数据模板放在固定大小的容器(网格)中。
  • 当数据对象可以轻松提供相同的信息时,避免/删除使用复杂的转换器。
  • 避免/删除嵌套结构,列表框项中的示例列表框。
  • 强烈建议不要在数据模板中使用用户控件。
  • 避免/从数据模板中删除自定义控件

下面的链接包含一个简单项目中ListBox性能的演示。

该项目还显示了一种替代(更快)的方式来显示列表,使用带按钮的网格。此列表不可滚动,因此不是真正的解决方案

http://www.mediafire.com/?jypcfm4cs3nvo5c

请记住在设备上运行项目,因为模拟器具有非常不同的性能。我在三星Omnia 7上测试了它。

1 个答案:

答案 0 :(得分:4)

听起来你正在创建自己的AutoCompleteBox。是否有特定原因不使用Toolkit中的那个?

我希望更新列表框所需的时间取决于:你如何更新它;列表框的复杂性;以及页面上的其他内容。
因为你没有提供任何有关这些的详细信息,所以可能需要很长时间。


修改
作为AutoCompleteBox的替代(理论上你不需要滚动结果 - 只需输入更多的字符进一步过滤。)我做了一些实验,以下似乎效果最好。它在StackPanel内使用ScrollViewer并重复使用现有项目,而不是创建新项目。

<ScrollViewer Height="629" Margin="0,139,0,0" Width="480">
    <StackPanel Name="listBox1" />
</ScrollViewer>

cs:

    private void InitializeResultsGrid()
    {
        ...

        for (int i = 0; i < 26; i++)
        {
            ...

            listBox1.Children.Add(new TextBlock());

private void SlowFill(string baseStr)
{
    for (int i = 0; i < buttons.Count; i++)
    {
        (listBox1.Children[i] as TextBlock).Text = baseStr + (char)(i + 'a');
    }

当我计时时,它比使用网格略慢,但LG-E900上的性能似乎很好