リストボックスで画像を読み込むwpfアプリケーションを開発しました.300mbの画像を読み込むには時間がかかります。画像をリストボックスで高速に読み込むためにobservablecollectionしかし、私はその1つを使用する方法を知らない。 提案があります。 ありがとうございますobservablecollectionクラスを作成してWPFアプリケーションで画像をロードする方法
答えて
ObservableCollectionはListとまったく同じように使用できます。しかし、画像の読み込みを高速化するのに役立ちません...
あなたがする必要があるのは、ListBoxを画像を含むObservableCollectionにバインドし、別のスレッドの画像でコレクションを埋めることです。通常、別のスレッドからバインドされたコレクションを変更することはできませんが、この問題を処理できるAsyncObservableCollectionクラスを作成しました。
画像をObservableCollection
に移動するだけで、魔法のように読み込み速度が向上することはありません。ディスクから画像データを読み込むのはずっと時間がかかるでしょう。これをバックグラウンドスレッドに移動して、イメージデータのロード中にメインのUIスレッドがハングしないようにする必要があります。 BackgroundWorkerまたはDispatcherのいずれかを調べ、スレッドコードをすべて自分で書き込む必要はありません。
コレクション内のアイテムを追加/削除/置き換えて、UIがそれらの変更で自動的に更新されることを期待する場合はObservableCollectionが必要です。つまりObservableCollectionはThomasまたはAndyのバックグラウンドスレッドでのロードの提案には完璧です。
これには制限がありますが、ここで言及する価値があります。 ListBoxは、現在表示されているリストアイテムのUI要素のみを作成します。一度に少数の画像しかリストボックスに表示されず、他のものがすべて表示外にスクロールされる場合、これを利用してListBoxに画像を遅延ロードさせることができます。
このため、実際の画像オブジェクトをListBoxに配置しません。代わりに、必要に応じてイメージをロードできるものを配置します。ディスクやWebから画像をロードする場合は、リストにUrisが含まれている可能性があります。 Webサービスから読み込んでいるような気がしますが、リストにはImageプロパティを持つクラスのインスタンスが含まれている可能性があります。
次に、コレクション(ObservableCollectionである必要はない)をListBoxにバインドし、ItemTemplateを適切なUIを構築し、Uriまたは遅延読み込みImageプロパティにバインドするDataTemplateに設定します。
アップサイド:シンプルさ。スレッドコードを書く必要はありません。
ダウンサイド:データ量にもよりますが、スクロールを開始するまで、後の画像はロードされないため、スクロールが遅くなる可能性があります。また、私が指摘したように、画像が最初に表示されたときにListBoxに収まる場合、これではあまり得られず、スレッディングはより良い答えになります。そしてUriには大きな落とし穴があります。一度スクロールすると、ListBoxは最初のアイテムのために読み込んだイメージを投げ捨てるので、スクロールバックはスクロールダウンと同じくらい遅くなります(カスタムクラスはレイジーローディングプロパティはこれを修正します)。
- 1. LINQでObservableCollectionクラスを作成する
- 2. WPF - キャンバスに画像を作成して描画する
- 3. wpfアプリケーションで画像に関する情報を知る方法
- 4. WPFアプリケーションでInterop.WIAを使用して画像をスキャンする方法
- 5. observableCollectionを作成する方法
- 6. ObservableCollectionを作成する<T>クラス
- 7. 2つの画像で画像を作成する方法
- 8. iosで画像をロードする方法
- 9. WPFで画像を動的に生成する方法は?
- 10. バインディングリストビューアイテムテンプレート画像ObservableCollectionが動作しない
- 11. 画像を圧縮して画像ファイルを作成する方法Uri
- 12. 画像を変更してlistViewを作成する方法
- 13. スキャナメソッドを使用して画像を再作成する方法
- 14. Wpfアプリケーション - どの画面をアプリケーションに保存してロードするのですか
- 15. WinFormアプリケーションでWPFウィンドウをプログラムで作成する方法
- 16. 非画像データからグレースケール画像を作成する方法
- 17. WPF MVVMアプリケーションのサービスレイヤのObservableCollection
- 18. ドッカーファイルを作成してドッカー画像を作成する方法は?
- 19. XamarinはObservableCollectionの画像を示す水平リストビューを作成します
- 20. WPFアプリケーションで楕円形のボタンを作成する方法は?
- 21. 'pandas.DataFrame.plot'で作成した画像を保存する方法は?
- 22. ウェブページに多数のPHP生成画像をロードする方法
- 23. アンドロイド新しい画像をロードする前に画像をリサイクルする方法
- 24. SubSonic 2.2コレクションからWPF ObservableCollectionを作成する
- 25. WPFでボタンイメージを作成する方法
- 26. WPFでフローティングボタンを作成する方法
- 27. wpfアプリケーションの画像ドラッグアンドドロップ
- 28. ObservableCollectionのCollectionViewをSilverlightで作成する方法
- 29. .NETプログラムでSharpDXに画像をロード/作成する
- 30. Flaskアプリケーション:現在の作業ディレクトリから画像をロードする
私はbackgroundworkerで試しましたが、まだそれは遅いです。 – ibrahimkhan
どの部分が遅いですか?問題が何であるか把握したい場合は、さらに情報を提供する必要があります。主スレッドがBackgroundWorkerが終了するまで待っているだけであれば、UIはまだハングします。 – Andy