【入門編】【初心者向け】VB.NETのWPFで学ぶGridとStackPanel:実務で迷わないレイアウトパネルの使い分けとレスポンシブ配置 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク
スポンサーリンク

Windows Formsの呪縛を解き放て。WPFの「Grid」と「StackPanel」をマスターして、真のレスポンシブUIを手に入れる

こんにちは。新しい技術の荒波に漕ぎ出そうとしているあなたを、心から歓迎します。

もしあなたがこれまで、Windows Forms(WinForms)で「ボタンを右下に置きたいからAnchorを調整しよう」「パネルを画面いっぱいに広げるためにDockを使おう」と、パズルのピースを無理やり押し込むような作業を繰り返してきたのなら……おめでとうございます。あなたは今、「モダンUI開発」という、より自由で、より強力な世界への入り口に立っています。

WPF(Windows Presentation Foundation)の世界へようこそ。

ここでは、コントロールを「座標(x, y)」で配置する考え方を捨てなければなりません。代わりに学ぶのは、「要素がどのように振る舞うべきか」という「ルール(レイアウト)」を定義する考え方です。

今日は、そのレイアウトの要となる二大巨頭、「StackPanel」と「Grid」について、実務で迷わないための極意を伝授します。ここをクリアすれば、画面サイズが変わっても美しく、プロフェッショナルなUIを構築する基礎はバッチリですよ。

1. なぜ WinForms の「Anchor/Dock」では足りないのか?

WinFormsでの開発は、いわば「キャンバスにシールを貼る」作業でした。ウィンドウを大きくしても、シールは貼られた場所のまま。だから、Anchor(アンカー)を使って「右端との距離を保て」と命令する必要があったのです。

しかし、現代のディスプレイは高解像度(4Kなど)が当たり前。ウィンドウのサイズはユーザーによって千差万別です。

WPFのレイアウトエンジンは、「中身に合わせて、枠が伸び縮みする」という動的な計算を自動で行います。この「計算のルール」を司るのが、今回学ぶパネルたちなのです。

2. StackPanel:要素を「積み上げる」シンプル・ルール

まず最初に触れるのが StackPanel です。
その名の通り、要素を「積み重ねる(Stack)」ためのパネルです。

特性と使いどころ

  • 動き: 要素を垂直(Vertical)または水平(Horizontal)に、順番に並べていきます。
  • 得意分野: 「ボタンを横一列に並べる」「設定項目を上から順に並べる」といった、単純な列挙に最適です。
  • 弱点: 「画面の半分をこのボタン、残り半分をこのテキストボックス」といった、比率に基づいた複雑な配置は苦手です。

⚠️ 初心者が陥る罠

StackPanelの中に要素を詰め込みすぎると、ウィンドウを小さくした時に要素が「はみ出して消える」現象が起きます。StackPanelは「中身が入り切るためのスペースを確保する」という性質が強いため、無理に縮小させることができないからです。

3. Grid:画面を「分割する」最強の設計図

実務におけるレイアウトの主役は、間違いなく Grid です。
Gridは、画面を「行(Row)」と「列(Column)」の格子状に分割し、そこに要素を配置する仕組みです。

ここが魔法の核心:Star(*)サイズ

Gridが最強である理由は、サイズ指定に 「Star(星印:*)」 という概念があるからです。

1. `Auto`: 「中身のサイズに合わせる」
2. `Fixed` (数値): 「〇〇ピクセルで固定する」
3. `*` (Star): 「余ったスペースを、比率に応じて分け合う」

例えば、`ColumnDefinition` を `1*` と `2*` に設定すれば、画面の幅がどれだけ変わろうとも、右側の列は左側の列の常に2倍の幅を維持し続けます。これこそが、レスポンシブ(柔軟な)配置の正体です。

4. 実践!「入力フォーム」を構築する

では、学んだ知識を統合しましょう。
「ラベルと入力欄が並ぶフォーム」を作り、その下に「OK/キャンセルボタン」を配置する、実務でよくある画面をイメージしてください。

この時、「全体の構造は Grid で作り、ボタンの並びは StackPanel で作る」 という組み合わせが、最も美しく、メンテナンスしやすい設計になります。

【XAML】レイアウトの設計図

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="モダンUI学習サンプル" Height="300" Width="400">
    
    <!-- 全体のレイアウトを Grid で定義 -->
    <Grid Margin="20">
        <!-- 行の定義: 1行目は中身に合わせ、2行目は余白をすべて使う -->
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <!-- 列の定義: 1列目はラベル用にAuto、2列目は入力欄用にStar -->
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- 1行目: 入力ラベル (Gridの0行目, 0列目) -->
        <Label Content="ユーザー名:" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"/>
        
        <!-- 1行目: 入力テキストボックス (Gridの0行目, 1列目) -->
        <!-- Grid.Column="1" を指定することで、右側の広いスペースを占有する -->
        <TextBox x:Name="txtName" Grid.Row="0" Grid.Column="1" Margin="5" Padding="3"/>

        <!-- 2行目: 説明テキストエリア (Gridの1行目, 全幅を占有) -->
        <!-- Grid.ColumnSpan="2" で2列分をぶち抜きで使うのがコツ -->
        <TextBox x:Name="txtDescription" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 
                 Margin="5" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto"/>

        <!-- 3行目: ボタンエリア (Gridの2行目, 全幅を占有) -->
        <!-- ここは「横に並べるだけ」なので StackPanel が最適 -->
        <StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" 
                    Orientation="Horizontal" HorizontalAlignment="Right">
            <Button x:Name="btnSubmit" Content="登録" Width="80" Margin="5" Click="btnSubmit_Click"/>
            <Button x:Name="btnCancel" Content="キャンセル" Width="80" Margin="5"/>
        </StackPanel>
    </Grid>
</Window>

【VB.NET】ロジックの実装

' MainWindow.xaml.vb

Class MainWindow
    ''' <summary>
    ''' 登録ボタンがクリックされた時の処理
    ''' </summary>
    Private Sub btnSubmit_Click(sender As Object, e As RoutedEventArgs)
        ' 入力値を取得
        Dim userName As String = txtName.Text

        ' バリデーション(簡易的)
        If String.IsNullOrWhiteSpace(userName) Then
            MessageBox.Show("ユーザー名を入力してください。", "入力エラー", MessageBoxButton.OK, MessageBoxImage.Warning)
            Return
        End If

        ' 結果の表示
        MessageBox.Show($"{userName} さんとして登録しました!", "成功", MessageBoxButton.OK, MessageBoxImage.Information)
    End Sub
End Class

5. エンジニアの視点:なぜこのコードが「正しい」のか?

このコードには、プロの現場で求められる「設計の意図」が込められています。

1. 役割の分離:

  • 画面の「骨組み(比率)」は Grid。
  • コントロールの「並び(流れ)」は StackPanel。

この使い分けが、コードの可読性を劇的に高めます。
2. Grid.ColumnSpan の活用:

  • 入力欄や説明エリアなど、横幅いっぱいに広げたい要素には `ColumnSpan` を使い、Gridの列をまたがせています。これにより、ウィンドウサイズが変わっても「常に端から端まで」を維持できます。

3. Starサイズによる伸縮性:

  • `RowDefinition Height=”*”` を使っているため、ウィンドウを上下に引き伸ばすと、中央のテキストエリアだけがグーンと伸びていきます。これは WinForms では非常に困難だった挙動です。

まとめ:次の一歩へ

いかがでしたか?
「どこに何を置くか」ではなく、「どのように振る舞わせるか」。この視点を持てた瞬間、あなたはもう WinForms のエンジニアではなく、WPF のアーキテクトへの道を歩み始めています。

  • StackPanel は、単純な積み重ね。
  • Grid は、比率(Star)を使った高度な分割。

まずは、小さなボタンを並べるだけの練習から始めてみてください。少しずつ、あなたの作る画面が「魔法のように」動くようになるはずです。

大丈夫、一歩ずつ進んでいきましょう。応援していますよ!

タイトルとURLをコピーしました