Performance Windows Phone 7 ListBox的性能很差,只有几个项目?

Performance Windows Phone 7 ListBox的性能很差,只有几个项目?,performance,windows-phone-7,listbox,Performance,Windows Phone 7,Listbox,我正在编写一个简单的字典应用程序,它可以在你打字时为你的单词提供建议。建议显示在a中,每次查询更改时,大约会显示10条建议 不幸的是,目前的绩效很低。结果显示几乎需要一秒钟,我不明白为什么。表明我的方法运行顺利。我已经通过在我的代码周围添加一个标记来确认这一点。我还尝试了大量的建议,并且性能确实会随着项目的减少而提高 这使我得出结论,呈现ListBox(我认为它发生在我的方法之外)是导致性能不足的罪魁祸首 在一个列表框中渲染10个项目真的需要250毫秒以上吗 如何在屏幕上快速输入少量单词 编

我正在编写一个简单的字典应用程序,它可以在你打字时为你的单词提供建议。建议显示在a中,每次查询更改时,大约会显示10条建议

不幸的是,目前的绩效很低。结果显示几乎需要一秒钟,我不明白为什么。表明我的方法运行顺利。我已经通过在我的代码周围添加一个标记来确认这一点。我还尝试了大量的建议,并且性能确实会随着项目的减少而提高

这使我得出结论,呈现ListBox(我认为它发生在我的方法之外)是导致性能不足的罪魁祸首

  • 在一个列表框中渲染10个项目真的需要250毫秒以上吗
  • 如何在屏幕上快速输入少量单词
编辑: 我填写列表框的方式非常简单。这条路对吗

resultsListBox.Items.Clear();
foreach (string s in suggestions.Words)
{
  resultsListBox.Items.Add(s);
}
resultsListBox.SelectedIndex = suggestions.MatchIndex;
您在这里看到的实际上是它:默认列表框、字符串项,没有模板。我是否违反了这些原则之一

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


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

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


记住在设备上运行项目,因为仿真器具有非常不同的性能。我已经在三星Omnia 7上对其进行了测试。

听起来您正在创建自己的自动完成盒。是否有特定的原因不使用中的一个

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


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

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

政务司司长:

private void InitializeResultsGrid()
{
...
对于(int i=0;i<26;i++)
{
...
listBox1.Children.Add(newtextblock());

private void SlowFill(字符串baseStr)
{
对于(int i=0;i

当我计时时,它比使用网格稍微慢一点,但在LG-E900上的性能对我来说似乎很好。听起来像是你在创建自己的自动完成盒。没有使用网格中的自动完成盒有什么具体原因吗

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


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

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

政务司司长:

private void InitializeResultsGrid()
{
...
对于(int i=0;i<26;i++)
{
...
listBox1.Children.Add(newtextblock());

private void SlowFill(字符串baseStr)
{
对于(int i=0;i

当我计时时,它比使用网格稍微慢一点,但在LG-E900上的性能对我来说似乎很好

谢谢你关于AutoCompleteBox的提示。但据我所知,它不是一个可滚动的列表,这正是我想要的。清除列表框可能是性能差的原因,但他们真的希望程序员这样做吗重新使用列表框中的项目,而不是删除它们并添加新对象?@Mathijs如果您能提供一个完整的工作示例,说明加载缓慢的原因,我将进一步研究。我在下面的“解决方案”中提供了一个示例。非常感谢您的时间!谢谢。这可能是您在不使用列表框:)谢谢你关于自动完成框的提示。但据我所知,它不是一个可滚动的列表,这正是我想要的。清除列表框可能是性能不佳的原因,但他们真的希望程序员重用列表框中的项,而不是删除它们并添加新对象吗?@Mathijs,如果你能提供的话这是一个完整的工作示例,显示了我将进一步研究的缓慢加载。我在下面的“解决方案”中提供了一个示例。非常感谢您的时间!谢谢。这可能是您在不实际使用listbox的情况下接近listbox的时间:)下面的链接包含一个简单项目中listbox性能的演示。The project还显示了一种显示列表的替代(更快)方法,即使用带有按钮的网格。
private void SlowFill(string baseStr)
{
    for (int i = 0; i < buttons.Count; i++)
    {
        (listBox1.Children[i] as TextBlock).Text = baseStr + (char)(i + 'a');
    }