2009-06-08 2 views

答えて

2

ObservableCollectionはListとまったく同じように使用できます。しかし、画像の読み込みを高速化するのに役立ちません...

あなたがする必要があるのは、ListBoxを画像を含むObservableCollectionにバインドし、別のスレッドの画像でコレクションを埋めることです。通常、別のスレッドからバインドされたコレクションを変更することはできませんが、この問題を処理できるAsyncObservableCollectionクラスを作成しました。

1

画像をObservableCollectionに移動するだけで、魔法のように読み込み速度が向上することはありません。ディスクから画像データを読み込むのはずっと時間がかかるでしょう。これをバックグラウンドスレッドに移動して、イメージデータのロード中にメインのUIスレッドがハングしないようにする必要があります。 BackgroundWorkerまたはDispatcherのいずれかを調べ、スレッドコードをすべて自分で書き込む必要はありません。

+0

私はbackgroundworkerで試しましたが、まだそれは遅いです。 – ibrahimkhan

+0

どの部分が遅いですか?問題が何であるか把握したい場合は、さらに情報を提供する必要があります。主スレッドがBackgroundWorkerが終了するまで待っているだけであれば、UIはまだハングします。 – Andy

2

コレクション内のアイテムを追加/削除/置き換えて、UIがそれらの変更で自動的に更新されることを期待する場合はObservableCollectionが必要です。つまりObservableCollectionはThomasまたはAndyのバックグラウンドスレッドでのロードの提案には完璧です。

これには制限がありますが、ここで言及する価値があります。 ListBoxは、現在表示されているリストアイテムのUI要素のみを作成します。一度に少数の画像しかリストボックスに表示されず、他のものがすべて表示外にスクロールされる場合、これを利用してListBoxに画像を遅延ロードさせることができます。

このため、実際の画像オブジェクトをListBoxに配置しません。代わりに、必要に応じてイメージをロードできるものを配置します。ディスクやWebから画像をロードする場合は、リストにUrisが含まれている可能性があります。 Webサービスから読み込んでいるような気がしますが、リストにはImageプロパティを持つクラスのインスタンスが含まれている可能性があります。

次に、コレクション(ObservableCollectionである必要はない)をListBoxにバインドし、ItemTemplateを適切なUIを構築し、Uriまたは遅延読み込みImageプロパティにバインドするDataTemplateに設定します。

アップサイド:シンプルさ。スレッドコードを書く必要はありません。

ダウンサイド:データ量にもよりますが、スクロールを開始するまで、後の画像はロードされないため、スクロールが遅くなる可能性があります。また、私が指摘したように、画像が最初に表示されたときにListBoxに収まる場合、これではあまり得られず、スレッディングはより良い答えになります。そしてUriには大きな落とし穴があります。一度スクロールすると、ListBoxは最初のアイテムのために読み込んだイメージを投げ捨てるので、スクロールバックはスクロールダウンと同じくらい遅くなります(カスタムクラスはレイジーローディングプロパティはこれを修正します)。

関連する問題