2011-01-08 7 views
3

私のアプリケーションでは、同じユーザーコントロールの束をScrollPanelにロードしています。問題は、これは非常に遅いことです。多くのユーザーコントロールをロードするパフォーマンスの問題

プロファイラは、私のユーザコントロールのコンストラクタのデザイナーコードで内部的に呼び出されるメソッドApplication.LoadComponent()がボトルネックであることを示しています。このメソッドのドキュメントには、このメソッドはXAMLというファイルをロードすると記載されています。

QAMLの代わりにBAMLを使用するにはどうすればよいですか。自分のユーザーコントロールのXAMLを新しいインスタンスを作成するときに何度も解析してはならないことをどのように達成できますか?ユーザーコントロールの読み込みを高速化する別の方法はありますか?

答えて

5

LoadComponent()すでに.bamlがロードされていますが、この問題については心配しないでください。 Microsoftはこれを意図的に行いました。開発者にbaml形式の依存関係を持たせないようにしました。今後は、既存のアプリケーションを壊さずにフォーマットを改善することができます。

はい、動作を高速化する別の方法があります。最初の最適化はUI virtualizationです。 WPFはすでに便利な形で提供されていますVirtualizingStackPanel。 ItemsControlと連携して動作し、一定の制限があります(たとえば、アイテムコンテナを作成して独自に追加した場合、仮想化が緩んでいるか、ScrollViewer.CanContentScroll="False"を再度設定した場合)。あなたはUIの仮想化についてさらに多くの情報Dan Crevier's blogを参照する必要があるように感じる場合は、仮想化を使用するには、おそらくItemsControl + DataBindingスタイルを使用するようにアプリケーションを書き換えること(すでに仮想化が有効になっているListBox

を持つことになります。

最終的なアドバイス。 UserControlsをカスタムコントロールに書き直すことができます。私の単純なパフォーマンステストは、次の数字を示しました。ユーザーコントロールのための

  • :それは取った同じビジュアルツリーで10Kコントロールを作成するには4932ms
  • for CustomControl:86ms;(〜57倍高速)

希望これは

+0

MSDNページ(http://msdn.microsoft.com/de-de/library/system.windows.application.loadcomponent.aspx)の状態に役立ちます明示的にLoadComponentがBAMLではなくXAMLを読み込む、それが問題です。私のUserControlは複数の他のコントロールのコンポジションなので、カスタムコントロールはここでは適切な選択ではありません。 – codymanix

+1

UI仮想化を推奨するようにしたいと考えています。これは、画面上の項目のみを表示します。 BAMLを使用しても、パフォーマンスは向上しません。 BAMLはXAMLのコンパイル版です。 – kevindaub

+2

「あなたはUserControlsをカスタムコントロールに書き直すことができますか?私は継承対構成の違いを理解していますが、なぜこのような劇的なパフォーマンスの違いがあるのか​​分かりません。 – Trinition

関連する問題