StackPanel を使用して、いくつかのコントロールを垂直にレイアウトしています (つまり、タイトル、サブタイトル、リストボックス、セパレーター、リストボックスなど)。
StackPanel は ScrollViewer の子であり、コンテンツが常にスクロール可能であることを保証します。
StackPanel のコントロールの 1 つは ListBox です。
その ItemsSource は巨大なコレクションにバインドされたデータであり、複雑な DataTemplate を使用して各アイテムを実現します。
残念ながら、それを使用するとパフォーマンスが非常に低下します (CPU/メモリが高い)。
私は試した
- ListBox の ItemsPanel を VirtualizingStackPanel に設定し、
- その ControlTemplate を ItemsPresenter のみにオーバーライドします (ListBox の ScrollViewer を削除します)。
しかし、パフォーマンスに違いはありませんでした。StackPanel は、測定中に内部の子に無限の高さを与えると思いますか?
ScrollViewer と StackPanel を他のパネル/レイアウト (Grid、DockPanel など) に置き換えたところ、パフォーマンスが大幅に向上したため、ボトルネックと解決策は仮想化にあると思いました。
このビューの CPU/メモリ パフォーマンスを改善する方法はありますか?
【アップデート1】
元のサンプル プロジェクト: http://s000.tinyupload.com/index.php?file_id=29810707815310047536
【アップデート2】
次の例を考え出すために、TreeView/TreeViewItems のスタイル変更/テンプレート化を試みました。起動にまだ時間がかかる/同じで、メモリ使用量が多い。しかし、一度読み込まれると、スクロールは元のサンプルよりもはるかに反応が良くなります.
起動時間/メモリ使用量をさらに改善する他の方法があるかどうか疑問に思いますか?
TreeView プロジェクトのスタイルを変更: http://s000.tinyupload.com/index.php?file_id=00117351345725628185
【アップデート2】
pushprajのソリューションは魅力のように機能します
- オリジナル:
- 起動:35秒、
- メモリ: 393MB
- スクロール: 遅い
- ツリー表示:
- スタートアップ:18代、
- メモリー 377MB、
- スクロール: 高速
- pushpraj のソリューション:
- 起動: <1 秒、
- メモリ: 20MB、
- スクロール: 高速