Windows Presentation Foundation (WPF) でのレイアウト管理について、実際にコントロールを配置しながら学びます。
WPFの主要なパネル(レイアウトコンテナ)の使い方と特徴を学びます。
- Grid: 行と列で柔軟にレイアウトを構築
- StackPanel: コントロールを一列に並べる
- DockPanel: 上下左右に配置してレイアウトを構築
以下の方に役立つ内容となっています。
- WPFでのレイアウト設計を学びたい方
- 複数のコントロールを整理して配置したい方
- 画面サイズに応じて柔軟にレイアウトを調整したい方
前回の「Hello Worldアプリ作成」で基本的なWPFアプリの作り方を学んだので、今回はより実践的なレイアウト管理について学んでいきます。
演習では、以下のようなメモ帳アプリの画面レイアウトを作成します。

レイアウト管理はWPFアプリ開発において非常に重要な要素です。
適切なパネルを選択することで、使いやすいアプリを作ることができます!
演習のコード一式はGitHubに置いてあります。
YouTube動画も以下にあります。
講義:WPFのレイアウト管理とは
パネルによるレイアウト管理
WPFでは、パネル(Panel)を使用してコントロールのレイアウトを管理します。
パネルはレイアウトパネル・レイアウトコンテナなどとも呼ばれることがあります。ここでは正式名称のパネルを使います。
パネルは以下の役割を担います。
- 配置ルール: コントロールをどのように配置するかを決める
- サイズ調整: ウィンドウサイズの変更に応じて自動的にサイズを調整
- 階層構造: パネルの中にパネルを配置する入れ子構造
主なパネルは以下になります。
パネル | 特徴 | 使用場面 |
---|---|---|
Grid | 表形式のレイアウト | 入力フォーム、ダッシュボード、複雑な画面レイアウト |
StackPanel | 縦または横に一列に配置 | ボタンの並び、ツールバー、リスト表示 |
DockPanel | 上下左右にドッキングして配置 | アプリのメイン構成、ウィンドウの基本レイアウト |
WrapPanel | 幅に応じて自動的に折り返し | タグ表示、アイコン一覧、サムネイルギャラリー |
Canvas | 絶対座標での配置 | 図形描画、簡易的なゲーム画面 |
これらを組み合わせたり、入れ子にしたりして使うことで複雑な画面レイアウトを作ることも可能です。
今回は最も使用頻度の高い Grid、StackPanel、DockPanel について詳しく学習します。
パネルの一覧は、Microsoft Learnの「パネル概要」の「派生パネル要素」も参考にしてください。
すべてのパネルはPanelクラスからの派生クラス(Panel継承したクラス)となっています。
Grid:表で配置
Gridは表のマス目にコントロールを配置できるレイアウトパネルです。
「ここは2行目・1列目」「ここは1行目・2列目」といった指定で、きっちりした画面レイアウトができます。以下が例です。
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Row="0" Grid.Column="0" Content="左上"/>
<Button Grid.Row="0" Grid.Column="1" Content="右上"/>
<Button Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Content="下段2マスぶち抜き"/>
</Grid>

ポイントは以下です。
- <Grid.RowDefinitions>、<Grid.ColumnDefinitions>で行・列の要素を定義
- 各コントロールの
Grid.Row
、Grid.Column
プロパティでGrid内の配置先を指定 - 各セルに1つずつコントロールを置くのが基本。必要なら「RowSpan」「ColumnSpan」で複数セルにまたがせることも可能。
詳しくは、公式リファレンス「Gridクラス」も参考にしてください。
StackPanel:一列に並べる
StackPanelは、子要素(ボタンなど)を縦または横一列にシンプルに並べるパネルです。
ナビゲーションメニューや縦に並んだ操作ボタンなど、「単純に上から順」「左から順」で並べたいだけならこれが一番簡単です。
以下が例です。
<!-- 縦配置 -->
<StackPanel>
<Button Content="上"/>
<Button Content="中"/>
<Button Content="下"/>
</StackPanel>
<!-- 横配置 -->
<StackPanel Orientation="Horizontal">
<Button Content="上"/>
<Button Content="中"/>
<Button Content="下"/>
</StackPanel>

ポイントは以下です。
Orientation
プロパティで縦(Vertical)か横(Horizontal)を選択(デフォルトは縦)。- 見た目(サイズや間隔)を揃えたい場合は、各子コントロールごとに
Margin
(外側の余白)やWidth
/Height
(サイズ)を個別調整。
詳しくは、公式リファレンス「StackPanelクラス」も参考にしてください。
DockPanel:上下左右の端に貼り付ける
DockPanelは、上下左右いずれかの端にピタッと貼り付ける(ドックする)ためのパネルです。
よくある「上にメニュー、左にツリー、下にステータスバー」などはこれで簡単にできます。
以下が例です。
<DockPanel>
<Button DockPanel.Dock="Top" Content="上"/>
<Button DockPanel.Dock="Bottom" Content="下"/>
<Button DockPanel.Dock="Left" Content="左"/>
<Button DockPanel.Dock="Right" Content="右"/>
<TextBlock Text="中央(残りを埋める)"/>
</DockPanel>

ポイントは以下です。
DockPanel.Dock
プロパティで、どの端に貼り付けるか指定- デフォルトで「最後の要素(ここではTextBlock)」が残りの空間を埋める(DockPanelのLastChildFill=True)
- 「上→下→左→右→中央」と並べるイメージ
詳しくは、公式リファレンス「DockPanelクラス」も参考にしてください。
次に、パネルを組み合わせて入れ子にしたより実践的なレイアウトについて、演習で作ってみましょう!
演習:レイアウトを組み合わせた実践アプリ
作成するアプリの概要
パネルを組み合わせて、以下の機能を持つ簡単な「メモ帳アプリ」を作成します。
- 上部:タイトル入力フィールド
- 中央:メモ内容の入力エリア
- 下部:保存・クリアボタン
※今回、保存機能はメッセージボックスを表示するダミーの実装にします。
以下の手順で作成します。
- 手順1:プロジェクトを作成
- 手順2:レイアウトを作成(XAML編集)
- 手順3:イベント処理を実装(C#コードビハインド)
手順1:プロジェクトを作成
新規WPFプロジェクトを作成します。作成方法は前回の記事の手順2「プロジェクト作成」を参考にしてください。

手順2:レイアウトを作成(XAML編集)
XAMLコード修正
MainWindow.xamlを選びます。

今回、デザイナのGUIを使わず、MainWindow.xamlでコードをそのまま修正してみましょう。
MainWindow.xamlで、「<Gird> … </Grid>」の部分 を以下のように「<DockPanel>…</DockPanel>」で置き換えましょう。
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<DockPanel>
<!-- 上部:タイトルエリア -->
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal" Margin="10">
<Label Content="タイトル:" VerticalAlignment="Center"/>
<TextBox x:Name="TitleTextBox" Width="200" Margin="5,0"/>
</StackPanel>
<!-- 下部:ボタンエリア -->
<StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal"
HorizontalAlignment="Right" Margin="10">
<Button Content="保存" Width="80" Margin="5"
Click="OnSaveButtonClick"/>
<Button Content="クリア" Width="80" Margin="5"
Click="OnClearButtonClick"/>
</StackPanel>
<!-- 中央:メモエリア -->
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Grid.Row="0" Content="メモ内容:"/>
<TextBox x:Name="ContentTextBox" Grid.Row="1"
AcceptsReturn="True" TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto"/>
</Grid>
</DockPanel>
</Window>
XAMLコードを書くと、デザイナへリアルタイムに内容が反映されます。

XAMLコードの要点
アプリ全体はDockPanel
でレイアウトされており、以下のように「上・中央・下」の3つのエリアに分かれています。
- 上部(タイトル)
StackPanel
(横並び)+Label
+TextBox
→ タイトル入力欄を横一列に並べ、画面の一番上(Top)に固定 - 中央(メモ内容)
Grid
(縦分割)+Label
+TextBox
→ 「メモ内容:」のラベルと、複数行入力できるメモ欄を上下に配置 - 下部(ボタン)
StackPanel
(横並び)+Button
×2
→ 操作ボタンを右端で横並びにし、画面下部(Bottom)に固定
プロパティの解説
主なプロパティを解説します。
どのコントロールでも共通に使えるプロパティとして以下があります。
- Margin(マージン)
外側の余白を指定します。
例:Margin="10"
は、上下左右10ピクセルの余白。 - HorizontalAlignment / VerticalAlignment
水平方向・垂直方向の配置位置を指定。
例:HorizontalAlignment="Right"
なら右寄せ。 - Height / Width
高さ・幅を固定
これらは様々なコントロールの位置調整でよく使われるプロパティです。
Girdの「<RowDefinition Height=●●>」では以下のようになります。(ColumnDefinitionだとWidth=●●で設定します。)
- “Auto”は、中に設置したコントロールの高さにあわせる
- ”*”は、残ったスペースを分配して広げる
“Auto”はラベルのような高さ固定の行、“*”はテキストボックスなど画面サイズに合わせて広がる部分に使うのが一般的です。
TextBoxはユーザ入力を受け付けるコントロールです。以下のように独自のプロパティがあります。
AcceptsReturn="True"
で、複数行入力対応。TextWrapping="Wrap"
で、テキストがTextBoxの横幅を超えたとき自動折り返し。VerticalScrollBarVisibility="Auto"
で、スクロールバー表示。
手順3:イベント処理を実装(C#コードビハインド)
次にMainWindow.xaml.csへイベント処理を実装します。

MainWindowクラスへOnSaveButtonClickメソッド、OnClearButtonClickメソッドを追加します。
...
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnSaveButtonClick(object sender, RoutedEventArgs e)
{
string title = TitleTextBox.Text;
string content = ContentTextBox.Text;
MessageBox.Show($"メモを保存しました!(ダミーです)\n\nタイトル: {title}\n内容: {content}",
"保存完了", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void OnClearButtonClick(object sender, RoutedEventArgs e)
{
var result = MessageBox.Show("内容をクリアしますか?", "確認",
MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes)
{
TitleTextBox.Clear();
ContentTextBox.Clear();
}
}
}
...
OnSaveButtonClickでは、TitleTextBox・ContentTextBoxの内容(Text)を取り出してメッセージボックスで表示しています。
OnClearButtonClickでは、MessageBoxで確認したうえでそれぞれのテキストボックスの内容をクリアしています。
アプリを実行
アプリを実行すると以下のようになります。

ウィンドウサイズを変えると、レスポンシブルにデザインが変わります。

複数のパネルを組み合わせることで、本格的なアプリのレイアウトが作れるんだね!
今回、DockPanelで全体構造を作り、StackPanelで部分的な配置を制御し、Gridで詳細レイアウトを管理していますね。
このような組み合わせはよくあるパターンです。これを応用すれば様々なレイアウトを組み立てられます!
まとめ
本記事では、WPFアプリ開発におけるレイアウト管理について学びました。
WPFのレイアウト管理には以下の特徴と利点があります。
- 柔軟なレイアウト構築:Grid、StackPanel、DockPanelなどのパネルを組み合わせることで、複雑な画面レイアウトを効率的に作成できる
- レスポンシブデザイン:ウィンドウサイズの変更に応じて自動的にサイズ調整が行われるため、様々な画面サイズに対応可能
(例:Gridでは「*」を使って入力欄を自動で広げられる)
主要なパネルの使い分けとして、Gridは表形式の複雑なレイアウトに、StackPanelは単純な一列配置に、DockPanelは上下左右への配置に適しています。
メモ帳アプリの演習を通じて、実際のアプリでこれらのパネルを組み合わせて使用する方法を学びました。
DockPanelで全体構造を作り、StackPanelで部分的な配置を制御し、Gridで詳細レイアウトを管理する組み合わせパターンは、実用的なWPFアプリ開発でも役立ちます。
引き続き、一緒にWPFアプリ開発を学んでいきましょう!