2013-01-24 157 views
9

私は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の責任ではなく、データのロードに時間がかかるので、非同期呼び出しは解決策ではありません。ユーザーはデータをすぐに入手する必要があります。

感謝

+0

あなたは仮想化を使用していますか?何千ものUIオブジェクトのレンダリングを開始するとWPFが遅くなるため、通常は表示されているアイテムをすべて表示するのではなくレンダリングし、スクロールするだけでコントロールの背後にあるDataContextを置き換えます。また、遅延を引き起こし、データをロードしないUIレンダリングであることを再度確認します。 – Rachel

答えて

10

TreeViewで仮想化を有効にする必要があるようです。 Optimizing Performance: Controlsから

:自分のリスト項目がデータにバインドされている場合、デフォルトで

は、UIの仮想化は、ListViewコントロールとListBoxコントロール コントロールに対して有効になっています。ツリービュー 仮想化は VirtualizingStackPanelを設定することで有効にすることができます:: TreeViewコントロールは、多くの項目が含まれている場合は、真

+0

私の場合、VirtualizingStackPanel :: IsVirtualizingの代わりにVirtualizingPanel.IsVirtualizingでした – Yogesh

+2

リンクが死んでいます..更新https://docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/optimizing-performance-controls –

1

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

+0

これはtreeviewコントロールの単なる制限ですか?私がやっていることは空の子ノードを追加することであり、それでもまだ妥当な時間がかかります。 2番目の各行は、ほとんど使用できない小さなアイコン画像を含みます。これをより速くするにはどんなトリックを使用できますか? – NZJames

3

に添付プロパティをIsVirtualizingすることは、それがロードするのにかかる時間は、ユーザーインターフェイスの大幅な遅延が発生することがあり。 VirtualizingStackPanel.IsVirtualizing添付プロパティをtrueに設定すると、読み込み時間を改善できます。ユーザーがマウスホイールを使用したり、スクロールバーの親をドラッグしたりすることで、ユーザーがTreeViewをスクロールしたときにUIが反応しなくなることもあります。 VirtualizationStackPanel.VirtualizationMode添付プロパティをRecyclingに設定することで、ユーザーがスクロールしたときにTreeViewのパフォーマンスを向上させることができます。

How to: Improve the Performance of a TreeView

XAML:プログラム

<TreeView Height="200" ItemsSource="{Binding Source={StaticResource dataItems}}" x:Name="myTreeView" 
     VirtualizingStackPanel.IsVirtualizing="True" 
     VirtualizingStackPanel.VirtualizationMode="Recycling"/> 

myTreeView.SetValue(VirtualizingStackPanel.IsVirtualizingProperty, true); 
myTreeView.SetValue(VirtualizingStackPanel.VirtualizationModeProperty, VirtualizationMode.Recycling) 
関連する問題