私のMVVMでItemsControl
にデータバインドされているObservableCollection
の仮想化スタックパネルを実装する方法の簡単な説明をお願いします。
タブコントロールの各タブにItemsControl
インスタンスがあり、ItemsControl
が大きくなるとタブの切り替えが非常に遅くなります。
アプリを高速化するにはどうすればよいですか?
WPFプロファイラーを開いたところ、各タブのItemsControlに表示されている各要素(カスタムユーザーコントロール)が独自のContentPresenter
を持っていることがわかりました。そのため、MVVMのObservableCollection
の100アイテムに対して、基本的に100人のコンテンツプレゼンターが実行されていました。これは正しいですか?どうすれば最適化できますか?
大きな助けになるかもしれない2つのテクニックがあります。両方とも、Bea Stolnitzが彼女について非常によく説明しています blog 。
最初は I Virtualization で、2番目は Data Virtualization です。
UI仮想化では、VirtualizingStackPanelのようなものを使用して、UIが描画するものを少なくします。
データ仮想化は、100を表示するだけの場合に、100万のオブジェクトをメモリに持ち込まないようにします。
したがって、UIの仮想化は描画されるものの数を最小限に抑え、データの仮想化は描画できるものの数を最小限に抑えます。
それが役に立てば幸い
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のプロパティ。ツリー全体を毎回再構築する必要があります
タブ項目が選択されています。これは通常、非常にコストのかかる操作です。 ....