あなたが言及するパネルはレイアウトパネルであるため、レイアウトシステムの簡単な概要は、最も効率的なパネルの単純なリストではなく、効率とパフォーマンスに最大の影響を与えるパネルの使用方法になる可能性が高いことを示唆しています。
LayoutSystem_Overview:
最もシンプルなレイアウトは、要素のサイズ設定、配置、描画につながる再帰的なシステムです。より具体的には、レイアウトは、Panel要素のChildrenコレクションのメンバーを測定して配置するプロセスを示します。レイアウトは集中的なプロセスです。Childrenコレクションが大きいほど、実行する必要がある計算の数が多くなります。コレクションを所有するPanel要素によって定義されたレイアウト動作に基づいて複雑さを導入することもできます。Canvasなどの比較的単純なPanelは、Gridなどのより複雑なPanelよりもパフォーマンスが大幅に向上します。
子UIElementがその位置を変更するたびに、レイアウトシステムによって新しいパスをトリガーする可能性があります。したがって、不必要な呼び出しによってアプリケーションのパフォーマンスが低下する可能性があるため、レイアウトシステムを呼び出すことができるイベントを理解することが重要です。次に、レイアウトシステムが呼び出されたときに発生するプロセスについて説明します。
1.子UIElementは、最初にコアプロパティを測定して、レイアウトプロセスを開始します。
2.幅、高さ、マージンなど、FrameworkElementで定義されたサイズ変更プロパティが評価されます。
3.ドックの方向やスタックの向きなど、パネル固有のロジックが適用されます。
4.コンテンツは、すべての子供が測定された後に配置されます。
5. Childrenコレクションが画面に描画されます。
6.コレクションに子がさらに追加された場合、LayoutTransformが適用された場合、またはUpdateLayoutメソッドが呼び出された場合、プロセスは再度呼び出されます。
子の測定と配置の詳細については、LayoutSystem_Measure_Arrangeを参照してください
LayoutSystem_Performance:
レイアウトは再帰的なプロセスです。Childrenコレクション内の各子要素は、レイアウトシステムを呼び出すたびに処理されます。その結果、レイアウトシステムが不要な場合は、トリガーしないでください。以下の考慮事項は、パフォーマンスの向上に役立ちます。
どのプロパティ値の変更がレイアウトシステムによる再帰的な更新を強制することに注意してください。
値によってレイアウトシステムが初期化される依存関係プロパティは、パブリックフラグでマークされます。AffectsMeasureとAffectsArrangeは、どのプロパティ値の変更がレイアウトシステムによる再帰的な更新を強制するかについて、有用な手がかりを提供します。一般に、要素の境界ボックスのサイズに影響を与える可能性のあるプロパティでは、AffectsMeasureフラグをtrueに設定する必要があります。詳細については、「依存関係プロパティの概要」を参照してください。
可能な場合は、LayoutTransformの代わりにRenderTransformを使用してください。
LayoutTransformは、ユーザーインターフェイス(UI)のコンテンツに影響を与える非常に便利な方法です。ただし、変換の効果が他の要素の位置に影響を与える必要がない場合は、RenderTransformがレイアウトシステムを呼び出さないため、代わりにRenderTransformを使用することをお勧めします。LayoutTransformはその変換を適用し、影響を受ける要素の新しい位置を考慮に入れて再帰的なレイアウト更新を強制します。
UpdateLayoutへの不要な呼び出しを避けます。
UpdateLayoutメソッドはレイアウトの再帰的な更新を強制するため、多くの場合、必要ありません。完全な更新が必要であることが確実でない限り、レイアウトシステムに依存してこのメソッドを呼び出します。
大規模なChildrenコレクションを操作する場合は、通常のStackPanelではなくVirtualizingStackPanelの使用を検討してください。
子コレクションを仮想化することにより、VirtualizingStackPanelは、現在親のViewPort内にあるオブジェクトのみをメモリに保持します。その結果、ほとんどのシナリオでパフォーマンスが大幅に向上します。
パフォーマンスの最適化:レイアウトとデザイン:この記事では、ツリーを効率的に構築する方法について詳しく説明し、複雑さに基づいてパネルの簡単なリストを提供します
キャンバス(最小複合体=より効率的で優れたパフォーマンス)
グリッド
その他のパネル(より複雑=効率が低く、パフォーマンスが悪い)
注意すべきその他のパフォーマンスの考慮事項: WPF UIレンダリング速度を改善する方法
- すべてをキャッシュします。ブラシ、色、ジオメトリ、フォーマットされたテキスト、グリフ。(たとえば、RenderToolsとTextCacheの2つのクラスがあります。各ユニットのレンダリングプロセスは、両方のクラスの共有インスタンスに対応します。したがって、2つのチャートに同じテキストがある場合、その準備は1回だけ実行されます。)
- Freeze Freezable(長期間使用する予定の場合)。特にジオメトリ。複雑なフリーズされていないジオメトリは、HitTestの実行を非常に遅くします。
- 各プリミティブをレンダリングする最速の方法を選択します。たとえば、テキストレンダリングには6つの方法がありますが、最速はDrawingContext.DrawGlyphsです。
- コンテナのリサイクルを有効にします。仮想化により、多くのパフォーマンスが向上しますが、コンテナーは破棄され、再作成されます。これがデフォルトです。ただし、VirtualizingStackPanel.VirtualizationMode = "Recycling"を設定してコンテナーをリサイクルすることで、より多くのパフォーマンスを得ることができます
- ここから:アプリケーションがサポートできるネストの量に実際的な制限はありませんが、通常、アプリケーションを制限して、目的のレイアウトに実際に必要なパネルのみを使用することをお勧めします。多くの場合、レイアウトコンテナとしての柔軟性により、ネストされたパネルの代わりにグリッド要素を使用できます。これにより、不要な要素をツリーから除外することで、アプリケーションのパフォーマンスを向上させることができます。