WPF で Panel をサブクラス化し、独自のレイアウト作業を実装し、availableSize 引数で MeasureOverride に渡されるディメンションの Infinity または PositiveInfinity を取得する人々から、他にもいくつかの質問を見つけました。応答は一般に、「これは、必要なだけスペースを占有できることを意味します。無視して、すべての子の必要なサイズを合計し、それを返します。」
私の場合、使用可能なスペースを埋めるために動的にサイズ変更するコントロールを作成しているため、目的のサイズの本質的な概念はありません。availableSize全体を使用したいだけです。
ControlTemplate を構築すると、StackPanel 内にネストされ、コントロールにスクロールバーがなくても、利用可能な高さの無限大を取得し始めました。固定数に制限しただけでは、ウィンドウにクリップするだけです。ActualHeight を返そうとしましたが、循環的であるためうまくいきませんでした。完全なレイアウト パスを実行する前に ActualHeight はありません。つまり、常に 0.0 でした。
最初は、それが Infinity を渡す StackPanel であるとは知らず、参照ソースをしばらく掘り下げて役に立たず、最終的に VisualTreeHelper を使用して親を実行し、それらの ActualHeight を見て、StackPanel が高さがゼロでない最も深いもの。必要なコントロールは 2 つだけなので、DockPanel に変更しました。これは、StackPanel と同様に機能します。そして見よ、DockPanel は利用可能な高さの Infinity を渡さない。
しかし、それは回避策のように感じます。レイアウトの背後にある哲学と、スクロールバーのない標準的なコンテナーの 1 つが、必要なだけのスペースを確保できる理由をより深く理解したいと思います。それに対する「正しい」反応は何ですか?