WPF 標準コントロールデモアプリ › Menu
Menu Menu
Menu は階層的なコマンドメニューを表示するコントロールです。アプリウィンドウの上部に水平メニューバーとして配置されるのが一般的で、サブメニューや区切り線、アクセスキー、ショートカットキーの表示をサポートします。
概要
WPF の Menu は MenuBase を継承したコントロールで、MenuItem の階層構造からなるコマンドメニューを提供します。アプリウィンドウの最上部に水平バーとして配置し、ファイル・編集・表示などのトップレベルメニューを並べるのが一般的なパターンです。
各 MenuItem は Header にメニューテキストを、Command に実行する ICommand を設定します。トップレベルの MenuItem はホバーでサブメニューを展開し、サブメニューの MenuItem はクリックでコマンドを実行します。Icon プロパティでメニューアイテムの左側にアイコンを表示できます。
IsCheckable を True に設定した MenuItem はチェックボックス付きのトグルメニューアイテムになり、IsChecked でオン/オフ状態を管理します。「表示 > ツールバーを表示」のようなトグル可能なメニューに使用します。
InputGestureText プロパティでキーボードショートカットの表示テキスト(例:Ctrl+S)を設定できます。実際のショートカット処理は KeyBinding で別途設定しますが、InputGestureText で MenuItem の右端にショートカット文字列を表示します。
画面キャプチャ

デモしているプロパティ
以下のプロパティが WPF 標準コントロールデモアプリでインタラクティブにデモされています。
| プロパティ | 設定値 | 説明 |
|---|---|---|
IsMainMenu | bool | ウィンドウに1つだけ配置するメインメニューバーに設定します。True のとき、ウィンドウのメインメニューとして登録され、Alt キーを押すとメニューにフォーカスが移動してキーボードナビゲーションが有効になります。DockPanel.Dock="Top" と組み合わせないとウィンドウ上部への配置が崩れることがあります。 |
IsCheckable (MenuItem) | bool | 「ツールバーを表示」「ステータスバーを表示」など、ON/OFF を切り替えるビュー設定メニューに使用します。True にすると、メニューアイテムの左端にチェックマークが表示されるトグルメニューアイテムになります。IsCheckable=True の MenuItem はユーザーがクリックするたびに IsChecked が自動で切り替わるため、IsChecked をバインドしていない場合は ViewModel との同期が取れなくなることがあります。 |
IsChecked (MenuItem) | bool | IsCheckable=True の MenuItem の状態を ViewModel の bool プロパティと同期させる際に使用します(例:IsChecked="{Binding IsToolBarVisible}")。チェック時はメニューアイテムの左端にチェックマークが表示され、False のときは非表示になります。複数の MenuItem で排他的な選択(ラジオボタン的な動作)を実装する場合、WPF は自動で排他制御しないため、グループ管理は ViewModel 側で手動で実装する必要があります。 |
Command (MenuItem) | ICommand | ICommand を実装した 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) | string | Ctrl+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>主な使用例
- アプリのメインメニューバー — ファイル・編集・表示などのカテゴリ別コマンドメニューをウィンドウ上部に配置します。
- コンテキストに応じたコマンド — 選択状態や編集モードに応じて MenuItem の IsEnabled を CanExecute で自動制御します。
- トグル可能なビュー設定 — ツールバー・ステータスバーの表示/非表示を IsCheckable な MenuItem でトグルします。
- 最近使ったファイル — 「ファイル」メニューの下部にバインドで動的生成する最近使ったファイルリストを追加します。
- サブメニュー階層 — 「表示 > ズーム > 拡大」のような 3 段階のネストしたサブメニューを実装します。
ヒントとベストプラクティス
- Command バインドを使う — MenuItem.Click イベントよりも Command バインドを使い、CanExecute で自動的に有効/無効を制御します。CanExecute の処理はメニューを開くたびに評価されるため、軽量な実装を心がけてください。
- アクセスキーは _ で設定 — Header テキストで _ の次の文字がアクセスキーになります(例:「ファイル(_F)」)。Alt を押すと下線が表示され、キーボードナビゲーションが有効になります。
- InputGestureText はテキスト表示のみ — InputGestureText はメニューの右端にショートカット文字列を表示するだけで、実際のキー処理は行いません。ショートカットを機能させるには Window.InputBindings に KeyBinding を別途追加する必要があります。この設定を忘れると「表示はあるが動作しない」という混乱を招くため注意してください。
- Separator で論理グループを分ける — 関連するコマンドグループは Separator で区切ってメニューの可読性を向上させます。Separator の IsEnabled や Visibility を制御することでグループ全体の表示・非表示も管理できます。
- ToolBar との組み合わせ — よく使うコマンドはメニューとツールバーの両方に配置し、目的に応じて使い分けられるようにします。
関連コントロール
ソースコード
このデモ画面のソースコードは GitHub で公開しています。