WPF 標準コントロールデモアプリ › StackPanel

StackPanel Layout

StackPanel は子要素を水平または垂直に1列に並べる最もシンプルなレイアウトパネルです。折り返しなしの線形配置で、ボタンバー・フォーム行・ナビゲーションメニューなど幅広い場面で使われます。

概要

WPF の StackPanel は子要素を一方向に積み重ねていくシンプルなパネルです。OrientationVertical(デフォルト)なら上から下へ、Horizontal なら左から右へと配置します。折り返し機能はないため、スペースが足りない場合は要素がクリップされます。

StackPanel は積み重ね方向には無限大のサイズを各子要素に与えるため、子要素は自然なサイズで表示されます。垂直 StackPanel では各子が全幅に引き伸ばされ(HorizontalAlignment=Stretch)、水平 StackPanel では各子が全高に引き伸ばされます(明示的に変更しない限り)。

StackPanel は ScrollViewer の中に配置してスクロールリストを作ったり、ItemsControl の ItemsPanel として使ったりするのが一般的なパターンです。シンプルな構造のため処理が軽く、フォームやダイアログの基本レイアウトコンテナとして多用されます。

子要素間の余白は StackPanel 自体には設定できないため、各子要素の Margin プロパティでスペーシングを管理するのが一般的なアプローチです。Style と Setter を使うと統一した Margin を一箇所で管理できます。

画面キャプチャ

stackpanel demo screen

デモしているプロパティ

以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。

プロパティ設定値説明
OrientationHorizontal / Verticalツールバーのボタン群やパンくずナビゲーションのように要素を横に並べたい場合は Horizontal、フォーム行や通知スタックのように縦に積みたい場合は Vertical を使います。Vertical StackPanel では子要素が全幅に引き伸ばされ(HorizontalAlignment=Stretch)、Horizontal StackPanel では全高に引き伸ばされます。Horizontal を狭いコンテナで使うとはみ出た要素がクリップされて折り返しがないため、折り返しが必要な場合は WrapPanel を使ってください。
Background (Panel)BrushStackPanel 全体がマウスホバーやクリックに反応させたいとき、たとえばハイライト効果を実装する場面で設定します。Transparent を指定するとパネル全体がヒットテスト可能になり MouseEnter などのイベントを受け取れますが、null(デフォルト)のままではヒットテストが無効で子要素のない空き領域でのクリックが素通りします。大きなパネル領域がマウスに反応しない場合は Background が null になっていないか確認してください。
ZIndex (Panel attached)intStackPanel 内で要素が重なり合う場面(負の Margin や絶対位置で意図的に重ねる場合)で描画順序を制御したいときに使います。値が大きいほど手前(上層)に描画されます。ZIndex は同一親パネル内でのみ有効であり、StackPanel の子要素に設定した ZIndex でその StackPanel の外側の要素より手前に表示させることはできません。

XAML 使用例

<StackPanel Orientation="Vertical" Margin="16">
  <Label Content="名前:" />
  <TextBox Text="{Binding Name}" Margin="0,0,0,8" />
  <Label Content="メール:" />
  <TextBox Text="{Binding Email}" Margin="0,0,0,8" />
  <Button Content="送信" HorizontalAlignment="Right"
          Command="{Binding SubmitCommand}" />
</StackPanel>

<!-- 水平ボタンバー -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
  <Button Content="OK" Width="80" Margin="0,0,8,0" IsDefault="True" />
  <Button Content="キャンセル" Width="80" IsCancel="True" />
</StackPanel>

主な使用例

ヒントとベストプラクティス

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。

GitHub で StackPanel のソースコードを見る →