35

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

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

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

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

4

2 に答える 2

52

大きな助けになるかもしれない2つのテクニックがあります。どちらも Bea Stolnitz のブログで非常によく説明されています。

1 つ目はUI 仮想化 、2 つ目はデータ仮想化です。

UI の仮想化では、VirtualizingStackPanel などを使用して、UI の描画を少なくします。

データ仮想化により、100 個しか表示しない場合でも、100 万個のオブジェクトをメモリに取り込まないようにすることができます。

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

それが役立つことを願っています

于 2009-09-21T10:23:40.057 に答える
9

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

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

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

于 2009-12-09T08:30:08.330 に答える