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

Menu Menu

Menu は階層的なコマンドメニューを表示するコントロールです。アプリウィンドウの上部に水平メニューバーとして配置されるのが一般的で、サブメニューや区切り線、アクセスキー、ショートカットキーの表示をサポートします。

概要

WPF の MenuMenuBase を継承したコントロールで、MenuItem の階層構造からなるコマンドメニューを提供します。アプリウィンドウの最上部に水平バーとして配置し、ファイル・編集・表示などのトップレベルメニューを並べるのが一般的なパターンです。

MenuItemHeader にメニューテキストを、Command に実行する ICommand を設定します。トップレベルの MenuItem はホバーでサブメニューを展開し、サブメニューの MenuItem はクリックでコマンドを実行します。Icon プロパティでメニューアイテムの左側にアイコンを表示できます。

IsCheckable を True に設定した MenuItem はチェックボックス付きのトグルメニューアイテムになり、IsChecked でオン/オフ状態を管理します。「表示 > ツールバーを表示」のようなトグル可能なメニューに使用します。

InputGestureText プロパティでキーボードショートカットの表示テキスト(例:Ctrl+S)を設定できます。実際のショートカット処理は KeyBinding で別途設定しますが、InputGestureText で MenuItem の右端にショートカット文字列を表示します。

画面キャプチャ

menu demo screen

デモしているプロパティ

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

プロパティ設定値説明
IsMainMenuboolウィンドウに1つだけ配置するメインメニューバーに設定します。True のとき、ウィンドウのメインメニューとして登録され、Alt キーを押すとメニューにフォーカスが移動してキーボードナビゲーションが有効になります。DockPanel.Dock="Top" と組み合わせないとウィンドウ上部への配置が崩れることがあります。
IsCheckable (MenuItem)bool「ツールバーを表示」「ステータスバーを表示」など、ON/OFF を切り替えるビュー設定メニューに使用します。True にすると、メニューアイテムの左端にチェックマークが表示されるトグルメニューアイテムになります。IsCheckable=True の MenuItem はユーザーがクリックするたびに IsChecked が自動で切り替わるため、IsChecked をバインドしていない場合は ViewModel との同期が取れなくなることがあります。
IsChecked (MenuItem)boolIsCheckable=True の MenuItem の状態を ViewModel の bool プロパティと同期させる際に使用します(例:IsChecked="{Binding IsToolBarVisible}")。チェック時はメニューアイテムの左端にチェックマークが表示され、False のときは非表示になります。複数の MenuItem で排他的な選択(ラジオボタン的な動作)を実装する場合、WPF は自動で排他制御しないため、グループ管理は ViewModel 側で手動で実装する必要があります。
Command (MenuItem)ICommandICommand を実装した ViewModel のコマンドや ApplicationCommands のビルトインコマンドを紐付ける際に使用します。Click イベントハンドラよりも MVVM パターンに適した方法です。CanExecute が false の場合、MenuItem が自動でグレーアウトして選択不可になります。CanExecute の処理が重い(データベースアクセスなど)場合、メニューを開くたびに評価されるためメニューの表示が遅くなることがあります。CanExecute はできるだけ軽量な処理にしてください。
Icon (MenuItem)objectよく使うコマンドや重要なメニューアイテムを視覚的に識別しやすくしたい場合に使用します。メニューアイテムの左端(チェックマーク位置)にアイコンが表示されます。テキストと組み合わせる場合は StackPanel(Orientation=Horizontal)に Image と TextBlock を並べます。Icon に設定できるのは UIElement であり、大きなサイズの画像を設定するとレイアウトが崩れるため、Width="16" Height="16" でサイズを固定してください。
InputGestureText (MenuItem)stringCtrl+S・Ctrl+N などのキーボードショートカットをメニューアイテムの右端にヒント表示したい場合に使用します。設定した文字列がメニューアイテムの右端に表示されますが、表示のみであり実際のショートカットキー処理は行いません。実際のショートカット動作を有効にするには Window.InputBindings に KeyBinding を別途追加する必要があります。この設定を忘れると表示はされるがショートカットが動作しないという混乱を招きます。

XAML 使用例

<DockPanel>
  <Menu DockPanel.Dock="Top" IsMainMenu="True">
    <MenuItem Header="ファイル(_F)">
      <MenuItem Header="新規作成(_N)" Command="ApplicationCommands.New"
                InputGestureText="Ctrl+N">
        <MenuItem.Icon>
          <Image Source="/Icons/new.png" Width="16" Height="16" />
        </MenuItem.Icon>
      </MenuItem>
      <MenuItem Header="開く(_O)" Command="ApplicationCommands.Open"
                InputGestureText="Ctrl+O" />
      <MenuItem Header="保存(_S)" Command="{Binding SaveCommand}"
                InputGestureText="Ctrl+S" />
      <Separator />
      <MenuItem Header="終了(_X)" Command="{Binding ExitCommand}" />
    </MenuItem>
    <MenuItem Header="表示(_V)">
      <MenuItem Header="ツールバーを表示" IsCheckable="True"
                IsChecked="{Binding IsToolBarVisible}" />
    </MenuItem>
  </Menu>
</DockPanel>

主な使用例

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

関連コントロール

ソースコード

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

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