我正在编写一个简单的字典应用程序,可以在您键入时为单词提供建议。建议显示在ListBox中,每次查询更改时,都应显示约10条建议。
不幸的是,目前表现很低。结果出现几乎需要一秒钟,我不明白为什么。 EQATEC Profiler表明我的方法运行顺利。我通过在代码周围加Stopwatch来证实这一点。我还尝试了一些建议,并且性能会随着项目的减少而增加。
这使我得出结论,渲染ListBox(我认为在我的方法之外发生)是缺乏性能的原因。
编辑: 我填充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上测试了它。
答案 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上的性能似乎很好