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

ToggleButton Inputs

ToggleButton はクリックするたびにオン/オフ状態を切り替えるボタンです。IsChecked プロパティで状態を保持し、CheckBox と RadioButton の基底クラスです。カスタムトグルスイッチや表示切り替えボタンの実装に使われます。

概要

WPF の ToggleButtonButtonBase を継承したコントロールで、クリックするたびに IsChecked が true と false の間でトグルします。IsThreeState="True" にすると null(不定)状態も追加されます。

ToggleButton は CheckBoxRadioButton の基底クラスです。これらの標準コントロールのような外観を持たないカスタムのトグル UI が必要な場合に ToggleButton を直接使用します。例えば、ツールバーのアクティブ/非アクティブなツール切り替えボタンや、表示/非表示をトグルするボタンなど。

IsChecked プロパティは bool?(null 許容)型です。MVVM では bool または bool? 型の ViewModel プロパティに TwoWay バインドします。

外観のカスタマイズには ControlTemplate を使用します。IsChecked の値によって外観が変わるよう、DataTrigger や VisualStateManager をテンプレート内で定義することで、スイッチ形式や押し込みボタン形式などのカスタムトグル UI を作成できます。

画面キャプチャ

togglebutton demo screen

デモしているプロパティ

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

プロパティ設定値説明
IsCheckedbool? (True / False / Null)ViewModel の bool または bool? プロパティと TwoWay バインドして、ボタンのオン/オフ状態を管理するときに使用します。true のとき押し込んだ状態(アクティブ)、false のとき通常状態、null のとき不定状態(IsThreeState=True の場合のみ)を視覚的に表現できます。null 状態はデフォルトのテンプレートでは中間的な外観(半押し状態のような見た目)で表示されます。注意点として、ViewModel が bool 型プロパティ(null 非許容)を使っている場合は null 状態を表現できず、IsThreeState と組み合わせるとバインドエラーが発生することがあります。3 状態を使う場合は必ず bool? 型を使用してください。
IsThreeStatebool「自動/オン/オフ」のような 3 段階の状態を 1 つのボタンで表現したいレアなユースケースで使用します。True にするとクリックのたびに false → true → null とサイクルします。ただし、3 つの状態それぞれが UI 上でユーザーに明確に伝わるビジュアルデザインが必要です。注意点として、一般的なトグルボタンの用途(オン/オフの切り替え)では 2 状態で十分であり、3 状態を使うと何を意味するか分かりにくくなります。ControlTemplate で各状態を明確に区別できるビジュアルを定義してください。
ClickMode (ButtonBase)Release / Press / HoverToggleButton は ButtonBase を継承しているため、ClickMode を利用できます。通常のトグルボタンには Release(デフォルト)が適していますが、Press を使えばマウス押し下げと同時に状態が切り替わるため、即時反応が求められる操作(例: 押している間だけアクティブなプレビューモード)に活用できます。Hover はマウスオーバーで状態が変わるため、誤操作のリスクが高く ToggleButton ではほとんど使用されません。
Command / CommandParameter (ButtonBase)ICommand / objectToggleButton のクリックごとに MVVM コマンドを実行したいときに使用します。クリックのたびにコマンドが発火し、CommandParameter で任意の値を渡せます。注意点として、CommandParameter にはクリック後の IsChecked の新しい値は自動では含まれません。コマンドハンドラ内で IsChecked の変化後の値が必要な場合は、IsChecked を直接 ViewModel にバインドして変化を検知するか、Interaction.Triggers の EventTrigger を使ってコマンドに渡すアプローチを検討してください。

XAML 使用例

<!-- 表示/非表示トグル -->
<ToggleButton Content="サイドパネルを表示"
             IsChecked="{Binding IsSidePanelVisible, Mode=TwoWay}" />

<!-- Popup との連動 -->
<ToggleButton x:Name="optBtn" Content="▼ オプション"
             IsChecked="{Binding IsPopupOpen, Mode=TwoWay}" />

<!-- ツールバーのモードトグル -->
<ToggleButton IsChecked="{Binding IsDrawMode, Mode=TwoWay}"
             ToolTip="描画モード">
  <Image Source="/Icons/pencil.png" Width="16" Height="16" />
</ToggleButton>

主な使用例

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

関連コントロール

ソースコード

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

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