web-dev-qa-db-ja.com

パフォーマンスを向上させるWPF VirtualizingStackPanel

私のMVVMでItemsControlにデータバインドされているObservableCollectionの仮想化スタックパネルを実装する方法の簡単な説明をお願いします。

タブコントロールの各タブにItemsControlインスタンスがあり、ItemsControlが大きくなるとタブの切り替えが非常に遅くなります。

アプリを高速化するにはどうすればよいですか?

WPFプロファイラーを開いたところ、各タブのItemsControlに表示されている各要素(カスタムユーザーコントロール)が独自のContentPresenterを持っていることがわかりました。そのため、MVVMのObservableCollectionの100アイテムに対して、基本的に100人のコンテンツプレゼンターが実行されていました。これは正しいですか?どうすれば最適化できますか?

34
bluebit

大きな助けになるかもしれない2つのテクニックがあります。両方とも、Bea Stolnitzが彼女について非常によく説明しています blog

最初は I Virtualization で、2番目は Data Virtualization です。

UI仮想化では、VirtualizingStackPanelのようなものを使用して、UIが描画するものを少なくします。

データ仮想化は、100を表示するだけの場合に、100万のオブジェクトをメモリに持ち込まないようにします。

したがって、UIの仮想化は描画されるものの数を最小限に抑え、データの仮想化は描画できるものの数を最小限に抑えます。

それが役に立てば幸い

51
Mike Two

TabControlとDataGridを使用してWPFでまったく同じ問題が発生しました。 DataGrid要素のサイズを大きくすると、タブの切り替えが非常に遅くなります。その後、前の回答で想定されているように、Bea Stolnitzのブログを読んでいるこの投稿を見つけました。それは私にDrWPFへのリンクを与えるgoogle "wpf tabcontrol VirtualizingStackPanel"へのヒントを与えました: http://groups.google.com/group/wpf-disciples/browse_thread/thread/6f3531a1720252dd

彼は問題を正確に説明し、解決策を提供します:-))

....パフォーマンスヒットはツリーの構築中です。残念ながら、
典型的なMVVMアプローチを使用しており、ItemsSourceをバインドしています
TabControlのプロパティ。ツリー全体を毎回再構築する必要があります
タブ項目が選択されています。これは通常、非常にコストのかかる操作です。 ....

9
user227789