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

TabControl Layout

TabControl は複数のページをタブで切り替えるコンテナコントロールです。TabItem を子要素として持ち、選択されたタブのコンテンツのみが表示されます。タブの位置(上・下・左・右)、動的なタブコレクションのバインドをサポートします。

概要

WPF の TabControlSelector を継承したコントロールで、複数の TabItem をタブとして管理し、選択されたタブのコンテンツを表示します。ウィザードの各ステップ、設定ダイアログのカテゴリページ、メインコンテンツエリアなどに使用されます。

TabStripPlacement プロパティでタブストリップ(タブヘッダーの一覧)の配置を上・下・左・右に変更できます。デフォルトは Top(上部)です。

静的なタブには XAML で TabItem を直接追加します。動的なタブコレクションには ItemsSource を使用し、HeaderTemplate で各タブのヘッダー表示、ContentTemplate でコンテンツ表示を定義します。

選択されたタブの追跡は SelectedIndex または SelectedItem で行います。ViewModel とバインドすることで、プログラムからタブを切り替えたり、選択変化に応じた処理を実行できます。

画面キャプチャ

tabcontrol demo screen

デモしているプロパティ

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

プロパティ設定値説明
TabStripPlacementTop / Bottom / Left / Rightタブストリップの配置位置を設定します。Outlook 風のサイドナビゲーションや縦に多くのカテゴリを並べるメニューには Left を使い、標準的な設定ダイアログには Top(デフォルト)を使います。Left/Right を設定するとタブストリップが垂直方向になりヘッダーテキストが横書きのまま縦に並びます。Left/Right では多くのタブがある場合に幅が足りずヘッダーが切り詰められることがあるため、ItemContainerStyle で MinWidth を設定して対処します。
SelectedIndex / SelectedItemint / object選択されているタブのインデックスとアイテムを取得・設定します。ViewModel からタブを切り替えたい場合(ウィザードのステップ制御、ナビゲーションなど)に TwoWay バインドを使います。SelectedIndex=-1 は何も選択されていない状態を意味し、コンテンツ領域が空になります。範囲外のインデックスを設定してもサイレントに無視され、ItemsSource にないオブジェクトを SelectedItem に設定しても同様に無視されます。
ItemsSourceIEnumerable動的なタブコレクションをバインドします。ViewModel のコレクションに基づいてタブを動的に生成する場合に使い、各タブの見た目は HeaderTemplate でヘッダー部分を、ContentTemplate でコンテンツ部分を定義します。ItemsSource を使うと各コレクション要素が TabItem として描画されます。落とし穴として、ItemsSource で動的バインドを使う場合は XAML で TabItem を静的に直接追加する方法と混在させることができず、どちらか一方の方法に統一する必要があります。
Header / IsEnabled (TabItem)object / boolTabItem のヘッダーテキスト(またはコンテンツ)と有効/無効状態を設定します。権限制御やウィザードフローで特定のタブへのアクセスを制限したい場合に IsEnabled=False を使います。IsEnabled=False にするとタブヘッダーがグレーアウトしてユーザーはクリックできなくなります。落とし穴として、IsEnabled=False でもプログラムから SelectedIndex を変更すれば無効タブのコンテンツが表示されてしまうため、表示制御はコンテンツ側でも行う必要があります。

XAML 使用例

<TabControl TabStripPlacement="Top"
            SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}">
  <TabItem Header="基本情報">
    <Grid Margin="8">
      <TextBox Text="{Binding Name}" />
    </Grid>
  </TabItem>
  <TabItem Header="連絡先">
    <Grid Margin="8">
      <TextBox Text="{Binding Email}" />
    </Grid>
  </TabItem>
  <TabItem Header="設定" IsEnabled="{Binding IsAdmin}">
    <StackPanel Margin="8">
      <CheckBox Content="詳細ログ" IsChecked="{Binding EnableLog}" />
    </StackPanel>
  </TabItem>
</TabControl>

主な使用例

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

関連コントロール

ソースコード

このデモ画面のソースコードは GitHub で公開しています。

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