【WPF】DockPanel の使い方を完全解説!端にピタッと寄せるレイアウト術

.NET

レイアウトコントロールとして、GridStackPanelWrapPanelと紹介してきました。この3つでもおおむねカバーできますが、次はDockPanelについて紹介したいと思います。

DockPanelについて

レイアウトイメージ

要素を上下左右の「端」に配置(ドッキング)するためのコントロールです。
例えば、メニューバーを上に、ステータスバーを下に、といった「画面の枠組み」を作るのに適しています。 「お弁当箱の仕切り」のように、端から順番に詰めていくイメージです。

コントロールの配置指定方法

Dockプロパティに上下左右を指定して、配置場所を指定していきます。
指定した場所に張り付くイメージになります。

ここで注意したいのは、子コントロールを追加する順番が大事になります。先に配置したコントロールが張り付き先の角をとることができます。

この場合Top → Bottom → Left → Right の順で配置したイメージになります。先に配置したほうが角をとることができます。この後実際のサンプルを見ながら確かめたいと思います。

使い方サンプル

それでは前回のWrapPanelのプロジェクトと同様にDockPanelのサンプルを追加していきたいと思います。

MainWindowにDockPanelのサンプルを表示する用のボタンを追加します。

DockPanelレイアウトのサンプルを「DockPanelLayoutWindow.xaml」として追加します。
DockPanelレイアウトの表示ボタンのクリックイベントハンドラに下記のようにコードを記載します。

private void ButtonDisplayDockPanelSample_Click(object sender, RoutedEventArgs e)
{
    DockPanelLayoutWindow window = new DockPanelLayoutWindow();
    window.Show();
}

ここまでは定番ですね。

エクスプローラー風

今回はWindowsのエクスプローラー風のレイアウトを作成してみました。

上:Menu / ToolBar
下:StatusBar
左:Navigation TreeView
中央:Main Content
このようなイメージです。

早速ですが、XAMLのコードです。

<Window x:Class="HelloWpfApp.DockPanelLayoutWindow"
        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:HelloWpfApp"
        mc:Ignorable="d"
        Title="DockPanelLayoutWindow" Height="450" Width="800">
    <Grid>
        <DockPanel>
            <Button DockPanel.Dock="Top" Background="RoyalBlue" Height="50"/>
            <Button DockPanel.Dock="Bottom" Background="DarkBlue" Height="50" />
            <TreeView DockPanel.Dock="Left" Background="LightYellow" Width="100" />
            <TextBox DockPanel.Dock="Right" Background="LawnGreen" />
        </DockPanel>
    </Grid>
</Window>

実行して、DockPanelレイアウトのウインドウを表示します。

今回はボタンで色をつけてわかりやすくしてあります。4つの部分が自動的に上、下、左、右の端にくっついて表示されます。ウィンドウサイズを変更するとそれに合わせて4つのレイアウト部分のサイズも変更されます。

実はこのレイアウトGridレイアウトを使っても同じような感じにレイアウトを組むことも可能です。でもこのくらいのレイアウトで大きな変更がない予定であればDockPanelも便利だと思います。

LastChildFillプロパティ

さて、今回のサンプルであれ?と思った方もいらっしゃるのではないでしょうか。最後に追加した右端にくっつくエリアのTextBoxが残り全体を占めています。これはLastChildFillプロパティが関与しています。

DockPanel はデフォルトで 「最後に書いた要素が残りのスペースをすべて埋める」 設定(LastChildFill=”True”)になっています。このため、最後に書いたTextBoxが残りのスペースを埋めて表示されています。

このプロパティをFalseにするとTextBoxは全体を埋めずに、指定した幅のサイズで右端にくっついて表示されます。
試しにLastChildFillプロパティをFalseにした実行結果です。

右端のTextBoxの幅を指定していないのですごく細く右端にくっついて表示されます。
このようにLastChildFillプロパティで動きが変わりますので、注意してください。

記述する順番

記述する「順番」が命です。
DockPanel は 「先に書いたもの勝ち」 です。

先に Left を書くか、先に Top を書くかで、角の部分の取り合いが変わります。今回は先にTop、Bottomを書いたので、上下が先に角をとっています。この順番を変えると微妙にレイアウトを変えることができます。

ここまでGrid、StackPanel、WrapPanel、DockPanelと紹介してきました。
Windows Formsと比べると柔軟にレイアウトを作成することができることがお分かりいただけていれば幸いです。


コメント

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