WPFでコントロールを取得して使用可能なスペースを埋めるにはどうすればよいですか?


304

一部のWPFコントロール(などButton)は、高さを指定しないと、コンテナー内の利用可能なすべてのスペースを喜んで消費するようです。

そして、いくつかは、私が今使用する必要があるもののように、(複数行)TextBoxとはListBox、コンテンツを収めるために必要なスペースを取るだけで心配しているように見えます。

これらの男をのセルに配置するUniformGridと、利用可能なスペースに合わせて拡大されます。ただし、UniformGridインスタンスはすべての状況に適しているわけではありません。いくつかの行が*高さに設定され、それ自体と他の行の間の高さを分割するグリッドがある場合はどうでしょうか。a StackPanelがあり、a Label、a List、a Buttonがある場合、リストを取得して、ラベルとボタンで満たされていないすべてのスペースをどのように使用できますか?

これは本当に基本的なレイアウト要件になると思いますが、可能な限りスペースを埋める方法を理解することはできません(それらを配置しDockPanelて埋めるように設定することも機能しないようです。DockPanel唯一のサブコントロール)によって必要なスペースを占めています。

あなたが一緒にプレイしていた場合はサイズ変更可能なGUIは非常に恐ろしいだろうHeightWidthMinHeightMinWidthなど

HeightWidthプロパティを、使用するグリッドセルにバインドできますか?またはこれを行う別の方法はありますか?


1
UniformGridは素晴らしいです。私の新しいデフォルトのgotoタグです。Stackpanelsのシンプルさ(divを思い出させます)が好きでしたが、Uniform Gridはまさに私が必要としていることを行います。
Terrance、2012

UniformGridを再設定します。重点は制服にあります。列の幅や行の高さは調整できないようです。各コンテンツが同じサイズの場合にのみ適しています。StackPanelをグリッドに置き換えたところ、Stretchは期待通りに機能しました。
pdschuller 2018年

この記事は、テキストボックスを拡大するのに役立ちました。
jpaugh

回答:


162

から派生する各コントロールPanelは、Measure()およびで実行される個別のレイアウトロジックを実装しますArrange()

  • Measure() パネルとその各子のサイズを決定します
  • Arrange() 各コントロールがレンダリングする四角形を決定します

DockPanelフィルの最後の子が残りのスペースを埋めます。LastChildプロパティをに設定すると、この動作を無効にできますfalse

StackPanelその所望の大きさのために、それぞれの子を要求し、それらをスタックします。スタックパネルはMeasure()、利用可能なサイズの各子を呼び出しInfinity、その子の希望サイズを使用します。

Aは、Gridすべての利用可能なスペースを占有し、しかし、それは彼らの所望の大きさにそれぞれの子を設定し、その後、細胞にそれらを中央に配置します。

あなたは、から派生させることによって、独自のレイアウトロジックを実装することができPanel、その後、オーバーライドMeasureOverride()ArrangeOverride()

簡単な例については、この記事を参照してください。


8
リンクが
無効に

6
@ user3690202 Archive.orgはあなたの友達です。リンクが復活しました。
ruffin

4
トピックはまだMSDNに存在しますが、リンクはこれに変更:docs.microsoft.com/en-us/dotnet/framework/wpf/controls/...
アンドレアAntonangeli

2
The last child of the DockPanel fills the remaining space:これは私の理解にとって欠けていた鍵でした。でも、明示的なDockのない要素がスペースを埋めているといつも思っています。
発見

238

また、そうでない場合にコントロールが使用可能なスペースを強制的に埋めるように設定できるプロパティもあります。たとえば、次のように言うことができます。

HorizontalContentAlignment="Stretch"

...コントロールのコンテンツを強制的に水平方向に引き伸ばします。またはあなたは言うことができます:

HorizontalAlignment="Stretch"

...コントロール自体を強制的に水平方向に引き伸ばして、その親を塗りつぶします。


88
これらすべてのケースで言及されている最も悪名高いパネルはStackPanelです。ContentAlignmentプロパティは含まれず、その子をStretchに設定しても、スターサイズのグリッド内では効果がありません。とてもイライラします。StackPanelがWPFチームが作成した最初のコンテナーであるかのように、それは事実です。
ブレント・スクーリー

4
@ブレント-ああ!スタックパネルのコンテンツを正しく入力しようとするのに悩まされてきました。ありがとう!それは私が非常に間違っていたものだと思いました。
アシュリーグレノン

8
@townseanスタックパネルは非常に制限されています。UniformGridを使用してストレッチし、行または列を0に設定すると、同様の動作が得られます
ForbesLindesay

2
@ Tuskan360 UniformGridでは、セルを同じサイズにすることのみが可能です。最後にグリッドを使用しましたが、機能しているようです。StackPanelが設計どおりの動作をしていないことに迷惑をかけています。
TarkaDaal

4
@TarkaDaalええ、すべてが同じサイズの場合はUniformGrid、複雑な相対サイズを指定する場合はグリッド、コンテンツに基づいてサイズに合わせてパネルをスタックし、使用可能なスペースを無視します。
ForbesLindesay

18

さて、私は投稿直後に自分でそれを見つけました。これは最も恥ずかしい方法です。:)

StackPanelのすべてのメンバーが、要求された最小サイズを満たすだけのようです。

DockPanelでは、間違った順序でドッキングしていました。TextBoxまたはListBoxが配置なしの唯一のドッキングされたアイテムである場合、またはそれらが最後に追加された場合、それらは必要に応じて残りのスペースを埋めます。

これを処理するより洗練された方法が欲しいですが、それでうまくいきます。


私は(この古い質問について!)「アラインメントなし」がここでのキーフレーズであることを指摘したいと思います。少なくともそれは私のためでした。
MikeBaz-MSFT 2013年

4

Horizo​​ntalAlignmentおよびVerticalAlignmentレイアウトプロパティを使用します。これらは、要素が必要とするよりも多くのスペースが利用可能な場合に、要素が親の内部にあるスペースをどのように使用するかを制御します。

たとえば、StackPanelの幅は、それに含まれる最も広い要素と同じ幅になります。したがって、すべての狭い要素には少し余分なスペースがあります。配置プロパティは、子要素が余分なスペースで何をするかを制御します。

両方のプロパティのデフォルト値はStretchであるため、子要素はすべての利用可能なスペースを満たすように引き伸ばされます。追加のオプションには、Horizo​​ntalAlignmentの場合はLeft、Center、Right 、VerticalAlignmentの場合は Top、Center、Bottomがあります。


31
これが常に真実であるならば、元の質問は尋ねられなかったでしょう。たとえば、LabelとTextBoxを備えた水平方向のStackPanelがあるとします。TextBoxの右側に余分なスペースがあります。TextBoxは自動幅に設定されます。Horizo​​ntalAlignmentにStretchを設定しても、TextBoxは残りのスペースを埋めません。
ブレント・スクーリー

常に正しいものはありませんが、この答えは私のニーズに合っています:DockPanel、Image。
アレロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.