2009-04-15 17 views
2

Iamは、リストボックスコントロールを使用するときにパフォーマンスが問題となるSilverlight 2を使用しています。私は約500レコードのオブジェクトのリストをバインドしており、データバインディングのために3〜4秒かかります。Silverlight 2の巨大なデータを持つリストボックスの性能問題

しかし、この問題はDataGridでは発生していません。

誰でもリストボックスの性能問題を改善するための答えがありますか?

答えて

2

アプリケーションに関する追加のコンテキストを知らなくても、いくつかのことが起こる可能性があります。最初に気になるのは、非常に「重い」ビジュアルツリーがあることです。 ListBoxの各アイテムは、ビジュアルオブジェクトのグラフを作成します。あなたが持っているほど、レンダリングに時間がかかります。

これらのアイテムが画面に表示されていない場合でも、Silverlightはそれらをレンダリングする作業を続けています。基本的に、これは、表示されていなくても、データバインドされたすべてのListBoxアイテムに対してLayout()およびMeasure()パスが実行されていることを意味します。

仮想化を使用して、Silverlightがその時点でコントロールの可視領域内に表示されていないコントロールのレイアウト/計測パスを実行しないようにするのが、トリックです。

ここにStackPanelでこれを行う方法を説明するブログ記事があります。これは、リストボックスに、この抽象的に多くを取るべきではないか、いっそのこと、あなたは単にあなたのListBox仮想化スタックパネルのコントロールコンテナを作ることができ、その後、あなたは:)

http://blogs.msdn.com/uberdemo/archive/2009/02/18/a-virtualizedstackpanel-control-in-silverlight-2-0.aspx

4

理由に行われるだろうDataGridはUI仮想化をサポートしており、ListBoxはサポートしていません。つまり、DataGridは可視アイテムのビジュアル要素のみを作成し、ListBoxはそのアイテムすべてのビジュアル要素を作成します。 非常に大きいアイテムのリストから選択する必要があるときはいつでも、ListBoxではなくDataGridを使用します。 DataGridのスタイルを設定し、TemplateColumnを使用してListBoxのように見えるようにすることができます。

マイケル

関連する問題