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

Grid Layout

Grid は WPF で最も強力で汎用的なレイアウトパネルです。行と列の定義によって子要素を表形式に配置し、比率・固定・自動サイズの組み合わせで複雑なレイアウトを実現できます。

概要

WPF の Grid は行(RowDefinition)と列(ColumnDefinition)を定義して子要素をセルに配置するパネルです。列幅や行高さは固定値(例:100)、自動(Auto)、比率(*)の 3 種類で指定でき、柔軟なレスポンシブレイアウトを実現します。

子要素の配置は Grid.RowGrid.Column 添付プロパティで指定します(0始まりのインデックス)。Grid.RowSpanGrid.ColumnSpan でセルをまたいで配置することもできます。

IsSharedSizeScopeSharedSizeGroup を組み合わせると、異なる Grid の列幅を揃えられます。例えば、リストの各行に Grid を使い、全行で同じ列幅を維持したい場合に使用します。

Grid は WPF の UI レイアウトの基礎となるコントロールで、ほぼすべての画面レイアウトに使用されます。フォーム、ダッシュボード、ダイアログのレイアウトなど、複数の要素を整列させる場面で活躍します。

画面キャプチャ

grid demo screen

デモしているプロパティ

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

プロパティ設定値説明
Column / Row (Grid attached) int 複数のセルを持つ Grid で子要素を特定のセルに配置したいときに使います。設定した行・列インデックスのセルに要素が配置されます。デフォルト値は両方とも 0 であり、Grid.Row/Grid.Column を設定しない要素はすべて 0 行 0 列に配置されて互いに重なり合います。Grid に複数の子要素を置くときは必ず設定漏れがないか確認してください。
ColumnSpan / RowSpan (Grid attached) int ヘッダー行やフッター行が全カラムにまたがる場合、または複数セルを占める大きなコンテンツを配置する場合に使います。設定した値だけ連続するセルを占有し、要素が複数セルにまたがって表示されます。スパン値が定義済みの列数・行数を超えた場合、Grid は超過分を無視して利用可能な最大セル数に黙って制限するため、意図した見た目にならない場合があります。定義している行・列の数と合っているか確認してください。
ShowGridLines bool レイアウトの組み方を確認したい開発・デバッグ時に True にします。点線のグリッド線が表示され、各セルの境界が一目でわかるようになります。ShowGridLines は通常の Border とは異なる専用のレンダリング機構を使っており、見た目を本番 UI のグリッド線として流用することは推奨されません。本番環境では必ず False に戻してください。
Width / MinWidth / MaxWidth (ColumnDefinition) GridLength / double ラベル列に Auto、入力フィールド列に * を組み合わせるなど、列の役割に応じたサイズ戦略を選ぶ際に設定します。* は残りスペースを比率で分配(2* と 1* なら 2:1)、Auto は内容幅に合わせ自動調整、数値は device-independent unit での固定幅を意味します。ScrollViewer や StackPanel の内部など有限の幅が与えられない場所では * サイズが 0 に潰れるため、Grid を ScrollViewer の直接の子にする際は注意が必要です。
Height / MinHeight / MaxHeight (RowDefinition) GridLength / double Width/MinWidth/MaxWidth と同様の考え方で行の高さを制御します。Auto は内容の高さに合わせて行が伸縮し、* は残りの縦スペースを比率分配、数値は固定高さを指定します。ScrollViewer の中で Auto 行を使うと、コンテンツが増えるにつれ行が可視領域を超えて伸長しても縦スクロールバーが現れないことがあります。縦スクロールが必要な場合は ScrollViewer を正しく設定しているか確認してください。
Background (Panel) Brush Grid 全体にホバーやクリックのマウスイベントを受け取らせたいときに設定します。Transparent(透明)を設定するとパネル全体がヒットテスト可能になり、マウスイベントを受け取れます。null(デフォルト)はヒットテストが無効なためクリックや MouseEnter が発生せず、背後の要素にイベントが素通りします。色ではなく透明にしたいが操作は受け付けたい場合は必ず Transparent を明示してください。

XAML 使用例

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="Auto" MinWidth="100" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto" />
    <RowDefinition Height="Auto" />
    <RowDefinition Height="*" />
  </Grid.RowDefinitions>

  <Label Grid.Row="0" Grid.Column="0" Content="名前:" />
  <TextBox Grid.Row="0" Grid.Column="1"
           Text="{Binding Name}" />

  <Label Grid.Row="1" Grid.Column="0" Content="メール:" />
  <TextBox Grid.Row="1" Grid.Column="1"
           Text="{Binding Email}" />

  <!-- 2 列にまたがるコンテンツ -->
  <TextBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2"
           TextWrapping="Wrap" Text="{Binding Notes}" />
</Grid>

主な使用例

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

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。アプリ内の「コード表示」ボタンから各プロパティの実際の XAML を確認できます。

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