Uncategorized

【C#/WPF実践入門編(3)】パネル(Panel)によるレイアウト管理の基本 ~Grid、StackPanel、DockPanelの使い方~【コントロール配置ガイド】

Windows Presentation Foundation (WPF) でのレイアウト管理について、実際にコントロールを配置しながら学びます。

WPFの主要なパネル(レイアウトコンテナ)の使い方と特徴を学びます。

  • Grid: 行と列で柔軟にレイアウトを構築
  • StackPanel: コントロールを一列に並べる
  • DockPanel: 上下左右に配置してレイアウトを構築

以下の方に役立つ内容となっています。

  • WPFでのレイアウト設計を学びたい方
  • 複数のコントロールを整理して配置したい方
  • 画面サイズに応じて柔軟にレイアウトを調整したい方

前回の「Hello Worldアプリ作成」で基本的なWPFアプリの作り方を学んだので、今回はより実践的なレイアウト管理について学んでいきます。

演習では、以下のようなメモ帳アプリの画面レイアウトを作成します。

プロ太

レイアウト管理はWPFアプリ開発において非常に重要な要素です。

適切なパネルを選択することで、使いやすいアプリを作ることができます!

演習のコード一式はGitHubに置いてあります。

YouTube動画も以下にあります。

講義:WPFのレイアウト管理とは

パネルによるレイアウト管理

WPFでは、パネル(Panel)を使用してコントロールのレイアウトを管理します。

プロ太

パネルはレイアウトパネル・レイアウトコンテナなどとも呼ばれることがあります。ここでは正式名称のパネルを使います。

パネルは以下の役割を担います。

  • 配置ルール: コントロールをどのように配置するかを決める
  • サイズ調整: ウィンドウサイズの変更に応じて自動的にサイズを調整
  • 階層構造: パネルの中にパネルを配置する入れ子構造

主なパネルは以下になります。

パネル特徴使用場面
Grid表形式のレイアウト入力フォーム、ダッシュボード、複雑な画面レイアウト
StackPanel縦または横に一列に配置ボタンの並び、ツールバー、リスト表示
DockPanel上下左右にドッキングして配置アプリのメイン構成、ウィンドウの基本レイアウト
WrapPanel幅に応じて自動的に折り返しタグ表示、アイコン一覧、サムネイルギャラリー
Canvas絶対座標での配置図形描画、簡易的なゲーム画面
プロ太

これらを組み合わせたり、入れ子にしたりして使うことで複雑な画面レイアウトを作ることも可能です。

今回は最も使用頻度の高い GridStackPanelDockPanel について詳しく学習します。

パネルの一覧は、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.RowGrid.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「プロジェクト作成」を参考にしてください。

【C#/WPF実践入門編(2)】はじめてのWPFアプリ作成 ~Hello WorldからButtonクリックまで~【XAML、コードビハインドの基本】 Windows Presentation Foundation (WPF) でのアプリ開発の基礎を、シンプルなHello Worldア...

手順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(横並び)+LabelTextBox
     → タイトル入力欄を横一列に並べ、画面の一番上(Top)に固定
  • 中央(メモ内容)
     Grid(縦分割)+LabelTextBox
     → 「メモ内容:」のラベルと、複数行入力できるメモ欄を上下に配置
  • 下部(ボタン)
     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アプリ開発を学んでいきましょう!

ABOUT ME
プロ太
●仕事:現在は個人事業主(メンター・情報発信等)、大手IT企業で技術者・マネージャ(15年以上)、大学の外部講師、学生時代は学習塾で非常勤講師(約4年間) ●博士(工学)の学位取得 ●高校生の頃に独学で始め、プログラミング歴20年以上 ●言語:C# 、Java、C/C++、Python、JavaScript/TypeScript等 ●分野:Webアプリ、テスト自動化、生成AI、デバッガ、コード解析、ドメイン特化言語

ご依頼・ご相談について

プログラミング学習のご相談、お仕事のご依頼については、
こちらのお問い合わせページをご確認ください。