私はWPFでツリービューのパフォーマンスを向上させようとしています.6000人の子供がいるノードを開くと、現在これを表示するのに約13秒かかります。私は子コレクションのobservablecollectionを使用しています。データテンプレートはTransactionViewModel型にバインドされています。これは約7列あり、それぞれがビューモデルからデータを取り込みます。WPFレンダリングのパフォーマンスが遅い
6000の子のトランザクションビューモデルが作成され、インスタンス化されますが、視覚的にまだ表示されていないため、初めてノードを展開すると、表示に13秒かかります。ノードを縮小して展開すると、表示/ロード時間がゼロになり、すぐに表示されます。私が見ることのできる唯一の違いは、TransactionviewModelのバインドされた依存プロパティのそれぞれがXAMLバインディングによって呼び出されたgetterを初めて持ち、2回目の再展開時に何も変更されていないためWPF does not getterをもう一度呼び出すと、2回目の展開時に束縛された情報がメモリに保持されていると考えられます。
コントロールの視覚的な描画は瞬時に行われますが、初めて(6000 transactionviewmodelオブジェクトがすでに子コレクションに完全にロードされていても)開いたときには、純粋に行のレンダリングが時間がかかります。
興味深いことに、私がviewmodelオブジェクトの任意の依存プロパティにバインドせずにブランクグリッドを出力するようにdatatemplateを変更すると、ロードにはまだ8秒かかります。したがって、データバインディングコールがなくても、ツリービューアは6000行をレンダリングするのに8秒かかります。余分な時間を5秒にすると、行ごとに5つのバインドされたデータ列が得られます。そのため、基本レンダリングに比べてコストが低くなります。
6000個の空白行をレンダリングする8sが私にとって非常に高いようです。 XAMLをデータテンプレートからツリービューにレンダリングする際に、これが起こっているか、または認識しておくべき大きな理由がありますか? Iveは空のデータテンプレートを使用しようとしました。つまり、内部に空白のグリッドはなく、まだ7秒かかります。
瞬時に折りたたまれ展開されるので、XAMLをレンダリングしたり、データバインディングを呼び出したりしていないときは、なぜ初めて長い時間がかかるのですか?
また、私の問題はGUIの責任ではなく、データのロードに時間がかかるので、非同期呼び出しは解決策ではありません。ユーザーはデータをすぐに入手する必要があります。
感謝
あなたは仮想化を使用していますか?何千ものUIオブジェクトのレンダリングを開始するとWPFが遅くなるため、通常は表示されているアイテムをすべて表示するのではなくレンダリングし、スクロールするだけでコントロールの背後にあるDataContextを置き換えます。また、遅延を引き起こし、データをロードしないUIレンダリングであることを再度確認します。 – Rachel