【问题标题】:Windows Phone 7 ListBox has bad performance with just a few items?Windows Phone 7 ListBox 只有几项性能不佳?
【发布时间】:2011-01-25 16:41:07
【问题描述】:

我正在编写一个简单的字典应用程序,它会在您键入时提供单词建议。建议显示在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 性能的演示。

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

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

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

【问题讨论】:

  • 下面的链接包含一个简单项目中 ListBox 性能的演示。该项目还展示了另一种(更快)显示列表的方法,使用带有按钮的网格。此列表不可滚动,因此不是真正的解决方案mediafire.com/?jypcfm4cs3nvo5c 记得在设备上运行项目,因为模拟器的性能差别很大。我已经在三星 Omnia 7 上测试过了。

标签: performance windows-phone-7 listbox


【解决方案1】:

听起来您正在创建自己的 AutoCompleteBox。不使用Toolkit 中的那个有什么具体原因吗?

我希望更新列表框所花费的时间取决于:您如何更新它;列表框的复杂性;以及页面上的其他内容。
由于您尚未提供有关其中任何一项的详细信息,因此可能需要这么长时间。


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

<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');
    }

当我计时时,它比使用 Grid 稍慢,但在 LG-E900 上我觉得性能还不错

【讨论】:

  • 感谢您提供有关 AutoCompleteBox 的提示。据我所知,它不是一个可滚动的列表,这正是我正在寻找的。​​span>
  • 清除 ListBox 可能是导致性能不佳的原因,但他们真的希望程序员重用 ListBox 中的项目,而不是删除它们并添加新对象吗?
  • @Mathijs 如果你能提供一个完整的工作示例来显示加载缓慢,我会进一步调查。
  • 我在下面的“解决方案”中提供了一个示例。非常感谢您的宝贵时间!
  • 谢谢。这可能与您接近列表框一样接近,而无需实际使用列表框:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多