1. ホーム
  2. c#

[解決済み] WPFの標準コントロールにDockStyle.Fillを使用するには?

2023-02-22 20:27:40

質問

私はWindowsフォームから、パネルを作成し、その中にコントロールを配置し、それらに DockStyle.Fill を使用して、周囲のパネルに対してそのサイズを最大化します。

WPFでも同じようにしたいです。TabControl があり、そのサイズがフォームのできるだけ多くを埋めるようにしたいです。 リボン コントロール (RibbonControlsLibrary) があり、フォームの残りを最大サイズの TabControl で満たしたいのです。

(Visual Studio のドッキングのようにコントロールをドッキングするのではなく、単に古いドッキング機構を使用したいのです)

どのように解決するのですか?

WinFormsのDockStyle.Fillに相当するWPFは。

HorizontalAlignment="Stretch" VerticalAlignment="Stretch"

これはほとんどのコントロールのデフォルトなので 一般に、WPFコントロールがその親コンテナを満たすために、何もする必要はありません。 : それらは自動的にそうします。 これは、子コンテナを最小サイズに絞らないすべてのコンテナについて当てはまります。

よくある間違い

では、このような「よくある間違い」をいくつか説明します。 HorizontalAlignment="Stretch" VerticalAlignment="Stretch" が期待通りに動作するのを妨げる、いくつかのよくある間違いを説明します。

1. 明示的な高さまたは幅

よくある間違いは、コントロールのWidthやHeightを明示的に指定することです。 ですから、もしあなたがこのような

<Grid>
  <Button Content="Why am I not filling the window?" Width="200" Height="20" />
  ...
</Grid>

WidthとHeightの属性を削除するだけです。

<Grid>
  <Button Content="Ahhh... problem solved" />
  ...
</Grid>

2. 制御を最小限の大きさに抑えたパネル

もう一つのよくある間違いは、コントロールが入るのと同じくらい狭くなるように、含むパネルが圧迫することです。 たとえば、垂直の StackPanel は、常にそのコンテンツを垂直方向にできるだけ小さく圧縮します。

<StackPanel>
  <Button Content="Why am I squished flat?" />
</StackPanel>

他のPanelに変更すれば、問題ありません。

<DockPanel>
  <Button Content="I am no longer squished." />
</DockPanel>

また、高さが "Auto" である任意の Grid 行または列は、同様にその方向にコンテンツを圧迫します。

子要素を圧迫しないコンテナの例をいくつか挙げます。

  • ContentControls は決してその子を圧迫しません (これには Border、Button、CheckBox、ScrollViewer、および他の多くが含まれます)。
  • 単一の行と列を持つグリッド
  • 行と列のサイズが "*"であるグリッド
  • DockPanel が最後の子を圧迫しないようにする。
  • TabControl がコンテンツを圧縮しない

子コンテンツを圧迫するコンテナの例をいくつか挙げます。

  • StackPanel はそのオリエンテーションの方向にスクイーズします。
  • Auto"サイズの行または列を持つグリッドは、その方向にスクイーズされます。
  • DockPanel は、その最後の子以外のすべてをその Dock 方向に縮小します。
  • TabControl はヘッダ(タブに表示されるもの)をスクイーズします。

3. 高さまたは幅をさらに明示する

このようにGridやDockPanelに明示的な高さや幅が与えられているのを何度も見かけるのは驚きです。

<Grid Width="200" Height="100">
  <Button Content="I am unnecessarily constrainted by my containing panel" />
</Grid>

一般に、どのパネルにも明示的な高さや幅を与えたくありません。 レイアウトの問題を診断するときの私の最初のステップは、見つけることができるすべての明示的な高さまたは幅を削除することです。

4. ウィンドウが、そうでないはずなのに SizeToContent になっている。

SizeToContentを使用すると、コンテンツは最小限のサイズに縮小されます。 多くのアプリケーションでは、これは非常に便利であり、正しい選択です。 しかし、コンテンツが自然なサイズでない場合は、SizeToContentを省略することをお勧めします。