WPF でコントロールを取得して利用可能なスペースを埋めるにはどうすればよいですか?
-
09-06-2019 - |
質問
一部の WPF コントロール ( Button
)高さを指定しないと、コンテナ内の利用可能なスペースをすべて喜んで消費するようです。
そして、今使用する必要があるものなど、(複数行) TextBox
そしてその ListBox
コンテンツを収めるために必要なスペースを取ることだけを心配しているようで、それ以上は心配していないようです。
こいつらを独房に入れたら UniformGrid
, 、利用可能なスペースに合わせて拡張されます。しかし、 UniformGrid
インスタンスはすべての状況に適しているわけではありません。グリッドの一部の行が * 高さに設定されていて、その高さを他の * 行との間で分割する場合はどうなるでしょうか?持っている場合はどうしますか StackPanel
そしてあなたは Label
, 、 List
そして Button
, 、ラベルとボタンによって占有されないすべてのスペースをリストに取得するにはどうすればよいですか?
これは本当に基本的なレイアウト要件だと思いますが、可能なスペースを埋める方法がわかりません(配置する) DockPanel
また、fill に設定しても機能しないようです。 DockPanel
サブコントロールが必要とするスペースのみを占有します)。
サイズ変更可能な GUI は、もし操作しなければならなかった場合、非常にひどいものになるでしょう。 Height
, Width
, MinHeight
, MinWidth
等
縛ってもらえますか? Height
そして Width
あなたが占有しているグリッドセルにプロパティを追加しますか?それとも別の方法がありますか?
解決
から派生する各コントロール Panel
で実行される個別のレイアウト ロジックを実装します。 Measure()
そして Arrange()
:
Measure()
パネルとその各子のサイズを決定しますArrange()
各コントロールがレンダリングされる四角形を決定します
の最後の子は、 DockPanel
残りのスペースを埋めます。この動作を無効にするには、 LastChild
財産を false
.
の StackPanel
それぞれの子供に希望のサイズを尋ね、それらを積み重ねます。スタックパネルの呼び出し Measure()
各子で利用可能なサイズは Infinity
そして子供の希望のサイズを使用します。
あ Grid
ただし、各子を希望のサイズに設定し、セルの中央に配置します。
以下から派生して独自のレイアウト ロジックを実装できます。 Panel
そしてオーバーライド MeasureOverride()
そして ArrangeOverride()
.
見る この記事 簡単な例として。
他のヒント
また、コントロールが利用可能なスペースを埋めることができない場合に、コントロールがその利用可能なスペースを埋めるように設定できるプロパティもいくつかあります。たとえば、次のように言うことができます。
HorizontalContentAlignment="Stretch"
...コントロールの内容を水平方向に強制的に拡大します。あるいは、次のように言うこともできます。
HorizontalAlignment="Stretch"
...コントロール自体を水平方向に引き伸ばして親を埋めるように強制します。
そうですね、投稿した直後に自分で気づきましたが、これが最も恥ずかしい方法です。:)
StackPanel のすべてのメンバーは、要求された最小サイズを満たすだけのようです。
DockPanel で、間違った順序でドッキングしていました。TextBox または ListBox が配置されていない唯一のドッキング項目である場合、または最後に追加された項目である場合は、必要に応じて残りのスペースを埋めます。
これを処理するもっとエレガントな方法を見てみたいと思っていますが、それでも十分でしょう。
使用 水平方向の配置 そして 垂直配置 レイアウトのプロパティ。これらは、要素に必要なスペースよりも多くのスペースが利用可能な場合に、要素が親内に持つスペースをどのように使用するかを制御します。
たとえば、StackPanel の幅は、それに含まれる最も幅の広い要素と同じ幅になります。したがって、すべての幅の狭い要素には少し余分なスペースがあります。配置プロパティは、子要素が余分なスペースをどのように扱うかを制御します。
どちらのプロパティのデフォルト値もストレッチであるため、子要素は利用可能なスペースをすべて埋めるように引き伸ばされます。追加オプションには、左、中央、右が含まれます。 水平方向の配置 および上、中央、下 垂直配置.