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

GridSplitter Resizer

GridSplitter は Grid の中に配置して行・列のサイズをドラッグで変更できるコントロールです。リサイズ可能なペインレイアウトの実装に使用されます。

概要

WPF の GridSplitterGrid 内のセルに配置することで、ユーザーがドラッグして隣接する行や列のサイズを変更できるようにするコントロールです。ファイルエクスプローラーのナビゲーションペインとコンテンツペインの境界線のような UI を実現します。

ResizeDirectionAuto(デフォルト)の場合、GridSplitter の配置と HorizontalAlignment/VerticalAlignment から自動的にリサイズ方向を判断します。列を分割する垂直スプリッターには HorizontalAlignment="Center"、行を分割する水平スプリッターには VerticalAlignment="Center" を設定するのが一般的です。

ShowsPreview を True にすると、ドラッグ中に半透明のプレビューが表示され、マウスボタンを離すまでリサイズが確定しません。False(デフォルト)ではドラッグ中にリアルタイムでサイズが変化します。

GridSplitter は Control を継承しているため、BackgroundBorderBrushTemplate などをカスタマイズして見た目を変更できます。ドラッグハンドルを示すドットパターンやグラデーションなどのカスタムスプリッターを作成できます。

画面キャプチャ

gridsplitter demo screen

デモしているプロパティ

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

プロパティ設定値説明
ResizeDirection Auto / Columns / Rows ユーザーが実行時にペイン幅や高さを自由に調整できるようにしたい場合(ファイルエクスプローラー・コードエディター・IDE 風 UI など)に使います。ユーザーがドラッグすると対象の Grid 列幅または行高さがリアルタイムに変化します。GridSplitter は必ず変更対象の Grid 行・列の中に配置する必要があり、Grid の外や別のパネル内に置いてもリサイズは機能しません。手動でサイズ変更不要なレイアウトには GridSplitter ではなく ColumnDefinition/RowDefinition の固定値を使うほうがシンプルです。
ResizeBehavior BasedOnAlignment / CurrentAndNext / PreviousAndCurrent / PreviousAndNext リサイズ対象のペアを明示的に指定したい場合に設定します。BasedOnAlignment(デフォルト)は HorizontalAlignment/VerticalAlignment から自動的にリサイズするペアを決定し、通常はこれで十分です。複雑なレイアウトで自動判定が意図と異なる場合に CurrentAndNext(現在と次)や PreviousAndCurrent(前と現在)などを明示指定します。設定を誤ると期待しない行・列がリサイズされるため、自動判定がうまくいかないときだけ変更を検討してください。
ShowsPreview bool 誤操作によるサイズ変更ミスを防ぎたい場合や、ドラッグ確定前に結果を確認させたい UX が必要なときに True に設定します。True にすると半透明のプレビューが表示され、マウスボタンを離したときにリサイズが確定します。False(デフォルト)はドラッグ中にリアルタイムでサイズが変化します。ShowsPreview=True の場合は PreviewStyle プロパティでプレビューの見た目をカスタマイズできます。
KeyboardIncrement double アクセシビリティ要件や細かいサイズ調整が必要な場面で、キーボード操作によるリサイズのステップ幅を調整したいときに設定します。矢印キーを押すたびにこの値(device-independent unit)分だけサイズが変化します。デフォルトは 10 です。大きな値を設定するとキーボードでの操作が粗くなり、小さい値では細かく調整できます。キーボードリサイズを完全に無効化する方法はないため、必要なら MinWidth/MinHeight で最小値を設定してサイズが 0 になることを防いでください。
DragIncrement double ドラッグ時のサイズ変化をグリッド状にスナップさせたい場合(例:10px 単位で吸い付かせる)に使います。デフォルトは 1 で、1 device-independent unit 単位で連続的にリサイズできます。値を大きくするとドラッグがスナップし、特定の間隔にしか止まれなくなります。スナップが不自然な操作感につながる場合があるため、特別な要件がなければデフォルトの 1 のままにしてください。

XAML 使用例

<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="200" MinWidth="100" />
    <ColumnDefinition Width="5" />
    <ColumnDefinition Width="*" />
  </Grid.ColumnDefinitions>

  <!-- 左ペイン -->
  <TreeView Grid.Column="0"
            ItemsSource="{Binding FileTree}" />

  <!-- 垂直スプリッター -->
  <GridSplitter Grid.Column="1"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                ShowsPreview="False"
                Background="LightGray" />

  <!-- 右ペイン(残り全スペース) -->
  <ContentControl Grid.Column="2"
                  Content="{Binding SelectedContent}" />
</Grid>

主な使用例

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

関連コントロール

ソースコード

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

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