13

WPF でツリービューのパフォーマンスを改善しようとしています。6000 の子を持つノードを開くと、現在これを表示するのに約 13 秒かかります。子コレクションに observablecollection を使用しています。データ テンプレートは約 7 列の TransactionViewModel タイプにバインドされており、それぞれがビュー モデルからデータを取得しています。

6000 の子のトランザクション ビューモデルが作成され、インスタンス化されますが、まだ視覚的に表示していないため、ノードを初めて展開すると、表示に 13 秒かかります。次にノードを縮小して展開すると、表示/ロードの時間がゼロで即座に表示されます。私が見ることができる唯一の違いは、TransactionviewModel のバインドされた依存関係プロパティのそれぞれが最初に XAML バインディングによって呼び出された getter を持っていることです。2 回目に再展開すると、何も変更されていないため、WPF は発生しません。ゲッターを再度呼び出すと、おそらくバインドされた情報を2回目に展開するときにメモリに保持するだけです。

したがって、コントロールの視覚的な描画は瞬時に行われますが、最初に開いたときは (6000 個の transactionviewmodel オブジェクトが既に子コレクションに完全に読み込まれていますが)、純粋に行のレンダリングに時間がかかっています。

興味深いことに、ビューモデル オブジェクトの依存関係プロパティにバインドしないようにデータ テンプレートを変更し、空白のグリッドを出力しただけでも、読み込みに 8 秒かかります。したがって、データ バインディング呼び出しがなくても、ツリー ビューアーは 6000 行をレンダリングするのに 8 秒かかります。5 秒余分に追加すると、行ごとに約 5 つのバインドされたデータ列が得られるため、基本的なレンダリングに比べてわずかなコストです。

6000 の空白行をレンダリングするための 8 秒は、私には非常に高いように思えます。これが発生する主な理由や、XAML をデータ テンプレートからツリービューにレンダリングする際に注意すべき点はありますか? 空のデータ テンプレートのみを使用してみました。つまり、内部に空白のグリッドさえなくても、7 秒かかります。

その後、折りたたまれてすぐに展開されることを考えると、XAML をレンダリングしたり、データ バインディングを呼び出したりしていないのに、最初に時間がかかるのはなぜでしょうか?

また、私の問題はGUIの応答性ではなく、データのロードにかかる時間であるため、非同期呼び出しは解決策ではありません。ユーザーは、現在取得しているよりも早くデータを取得する必要があります。

どうもありがとう

4

3 に答える 3

12

TreeView で仮想化を有効にする必要があるようです。

パフォーマンスの最適化から: コントロール:

既定では、リスト項目がデータにバインドされている場合、ListView および ListBox コントロールに対して UI 仮想化が有効になっています。TreeView の仮想化は、VirtualizingStackPanel::IsVirtualizing 添付プロパティを true に設定することで有効にできます。

于 2013-01-24T13:40:24.257 に答える
1

あなたの問題はレンダリングではなくレイアウトである可能性があります-多くのUI要素(スライダー)のサイズを適切に調整できるように、多くのUI要素をインスタンス化してそれらのサイズを見つける必要があり、これには時間がかかります。レンダリングはおそらくこれにはまったく入りません。

于 2013-01-24T11:46:32.683 に答える