2009-02-26 6 views
1

リストボックスコントロール内のアイテムを表示するSilverlightアプリケーションを開発していますが、パフォーマンスの問題が少しあります。SilverlightリストボックスListBoxでのパフォーマンスの問題

リストボックスの各項目は、書式付きテキストなどを含むカスタムのスタックパネルです。

リストのアイテムが500個以下の場合、リストボックスは正常に動作しますが、これ以上ロードすると問題が発生します。 1000アイテムでSilverlightは10%のCPUを消費しますが、何もしていなくても3000個のアイテムでCPUは​​常に32〜36%を使用します。

これはデュアルコアマシンで、古いマシンでテストしました.CPUの使用状況をテストしました。

これもフレームレートに影響します。3000アイテムのリストボックスで6fpsになり、アプリケーションが低速になります。

原因を知っている人はいますか?私の最初の考えは、アイテムがスクリーンから外れていても、Silverlightがすべてのアイテムをレンダリングしようとしていたことです。これはVisibility.Collapsedでアイテムを挿入した場合と同じように見えますが、余分なCPUオーバーヘッドは存在しません。

PS:Silverlightフォームのhtml ontopを表示する必要があるため、windowless = "true"で動作しています。

答えて

3

DataGridはUI仮想化をサポートするため、Silverlight 2で使用する必要があります。何百万というアイテムでテストされ、表示に必要なビジュアルだけを作成します。

+0

ありがとう、データグリッドを使用して何が起こるかを見ていきます。 – JSmyth

1

あなたの推測は基本的に正しいです。 Silverlightはをレンダリングしようとしませんが、ListBoxのすべての3000要素をレンダリングするには、3000個のListBoxItemオブジェクトを作成する必要がありますが、レンダリング時に切り捨てられるだけで、レイアウト時などに測定および配置が行われます。要素が折りたたまれていると、レイアウトはずっと速くなります(このシナリオではレイアウトには基本的に何もありません)。

WPFにはこの問題を解決するVirtualizingStackPanelがありますが、残念ながらSilverlightにはこの要素がありません。

1

+1このシナリオでSilverlight DataGridを使用する場合は、デフォルトのSilverlight SDKバージョンとしてlatest version installedがあることを確認してください。いくつかのバグがあります。

もう一つのオプションは、無料のSilverlight DataGridコントロールavailable hereを使用することです。その機能の1つにVirtual StackPanel Row Containerもあります。これは、グリッドが無制限の行数を処理できることを意味します。

それぞれのパフォーマンスを比較し、どの状況でどの作品が最適かを確認します。

0

これはSilverlight 4ではこれ以上問題にはならないようです。データテンプレートのリストボックスに100,000の要素を追加すると、瞬時になり、うまく描画されます。

0

これは私を助けました:Silverlight DeferredLoadListBox。 これはMicrosoftの従業員David Ansonによって作成されています。

DeferredLoadListBoxは、ListBoxに由来しますが、パフォーマンスははるかに優れています。

関連する問題