2011-01-25 12 views
0

私はあなたが入力する単語の提案を与える簡単な辞書アプリを書いています。提案はListBoxに表示され、クエリが変更されるたびに約10件の提案が表示されます。Windows Phone 7 ListBoxのアイテム数が少なすぎるとListBoxのパフォーマンスが低下しますか?

残念ながら、パフォーマンスは現時点では低いです。結果が表示されるまでにはほとんどの時間がかかり、理由はわかりません。 EQATEC Profilerは私のメソッドがスムーズに実行されていることを示しています。私はStopwatchを自分のコードの周りに置くことでこれを確認しました。また、提案の数を試してみたところ、項目数が少ないほどパフォーマンスは向上しました。

これは、リストボックスのレンダリング(私の方法の外で起こると思われます)は、パフォーマンスの不足のせいだと結論づけています。

  • ListBoxの10個のアイテムのレンダリングに実際に250ms以上かかるのですか?
  • 画面に少数の単語をすばやく配置するにはどうすればよいですか?

編集: 私のリストボックスを埋める方法はとても簡単です。それは正しい方法ですか?

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

ここに表示されているのは、実際のところ、デフォルトのリストボックス、文字列アイテム、テンプレートではありません。私はこれらのプリンシパルの1つに違反していますか?

  • 固定サイズのコンテナ(グリッド)にアイテムデータテンプレートがあることを確認してください。
  • データオブジェクトが同じ情報を簡単に提供できる場合は、複雑なコンバータを使用しないでください。
  • リストボックスアイテム内のネストされた構造(リストボックスの例)を回避/除去します。
  • データテンプレート内でユーザーコントロールを使用しないことを強くお勧めします。
  • 回避/データテンプレートからカスタムコントロールを削除

下記のリンクは、単純なプロジェクトでのListBox性能のデモが含まれています。

このプロジェクトでは、ボタンを含むグリッドを使用してリストを表示する代わりの(より速い)方法も示しています。このリストはスクロール可能ではないので、は実際の解決策ではありません

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

エミュレータは非常に異なった性能を持っているため、デバイス上でプロジェクトを実行することを忘れないでください。私はサムスンオムニア7でそれをテストしました。

+0

以下のリンクには、単純なプロジェクトでのListBoxのパフォーマンスのデモンストレーションが含まれています。 このプロジェクトでは、ボタンを含むグリッドを使用して、リストを表示する代替(より速い)方法も示しています。このリストはスクロール可能ではないので、は実際の解決策ではありません。 http://www.mediafire.com/?jypcfm4cs3nvo5c エミュレータは非常に異なった性能を持っているため、デバイス上でプロジェクトを実行することを忘れないでください。私はサムスンオムニア7でそれをテストしました。 – Matt

答えて

4

あなた自身のオートコンプリートボックスを作成しているようですね。 Toolkitにその1つを使用しない特定の理由はありますか?

リストボックスの更新に要する時間は、どのように更新するのか、リストボックスの複雑さ。何でも他のものがページにあります。
これらの詳細についてはまだ説明していないので、この時間がかかる可能性があります。


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

は、それがグリッドを使用するよりもやや遅かったが、性能もはLG-E900に私には罰金見えた

+0

オートコンプリートボックスについてのあなたのヒントありがとう。私が見る限り、それはスクロール可能なリストではありませんが、これは私が探しているものです。 – Matt

+0

ListBoxを消去するとパフォーマンスが低下する可能性がありますが、プログラマーはリストボックス内のアイテムを削除して新しいオブジェクトを追加するのではなく、リストボックス内のアイテムを再利用することを実際に期待していますか? – Matt

+0

@ Mathijs遅い負荷を示す完全な動作例を提供できるなら、私はさらに調査します。 –

関連する問題