要約
メニュー、子メニューは
XAMLの<menu><MenuItem>で設定。
ショートカットの設定は・・・
ICommandを継承した派生クラスを作る。
XAMLの <KeyBinding~で派生クラスにバインドさせる。(・・・?)
ICommandが呼ばれるとExecute(object parameter)が実行されるが、parameterに値を乗せることが可能。
CommandParameter=”~”でparameterに値を引き渡す。
XAML, コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<Window x:Class="menu.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:menu" mc:Ignorable="d" Title="MainWindow" Height="144" Width="385"> <!-- ショートカットの設定 --> <Window.InputBindings> <KeyBinding Command="{Binding TestCmd}" CommandParameter="Ctrl+O" Gesture="Ctrl+O"/> <KeyBinding Command="{Binding TestCmd}" CommandParameter="Ctrl+1" Gesture="Ctrl+1"/> <KeyBinding Command="{Binding TestCmd}" CommandParameter="Ctrl+2" Gesture="Ctrl+2"/> </Window.InputBindings> <Grid> <DockPanel> <Menu DockPanel.Dock="Top"> <MenuItem Header="ファイル(_F)"> <MenuItem Header="ファイルを開く(クリックイベント、ショートカット、別々に発動)...(_O)" InputGestureText="Ctrl+O" Click="OpenFile_Click"/> <MenuItem Header="ファイルを開く(ショートカットのみ発動、クリックイベントはないが、クリックするとショートカットが発動)...(_1)" Command="{Binding TestCmd}" InputGestureText="Ctrl+1"/> <MenuItem Header="ファイルを開く(クリックイベント、ショートカット混在。クリック時はショートカットコマンドも発動)...(_2)" Command="{Binding TestCmd}" InputGestureText="Ctrl+2" Click="OpenFile_Click"/> <MenuItem Header="子メニュー有り(_C)"> <MenuItem Header="子メニュー1(_A)" Click="ChildItem1_Click"/> <MenuItem Header="子メニュー2(_B)"/> </MenuItem> <Separator></Separator> <MenuItem Header="閉じる"/> </MenuItem> <MenuItem Header="メニュー2(_B)"/> </Menu> <StackPanel> <Button x:Name="button" Content="Button" Width="75"/> <Button x:Name="button1" Content="Button" Width="75"/> </StackPanel> </DockPanel> </Grid> </Window> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
using System; using System.Windows; using System.Windows.Input; namespace menu { /// <summary> /// MainWindow.xaml の相互作用ロジック /// </summary> public partial class MainWindow : Window { public TestCommand TestCmd { get; set; } public MainWindow() { InitializeComponent(); TestCmd = new TestCommand(); DataContext = this; } private void OpenFile_Click(object sender, RoutedEventArgs e) { try { MessageBox.Show("ファイルを開くが押された"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void ChildItem1_Click(object sender, RoutedEventArgs e) { try { MessageBox.Show("子アイテムがクリックされた"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } public class TestCommand : ICommand { public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { try { if ((string)parameter == "Ctrl+O") { MessageBox.Show("Ctrl+O"); } else if ((string)parameter == "Ctrl+1") { MessageBox.Show("Ctrl+1"); } else if ((string)parameter == "Ctrl+2") { MessageBox.Show("Ctrl+2"); } else if (parameter is null) { MessageBox.Show("parameter is null"); } else { MessageBox.Show("parameter その他"); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } } |
参考
[] C#のWPFでメニューを作成する – Ararami Studio
C#のWPFでメニューを作成する
WPFでメニューを作成する方法について解説します。
[] [WPF] メニューを作成する | HIROs.NET Blog
[WPF] メニューを作成する
本TipsはWPFのみとなります。あらかじめご了承ください。 メニューを作成するには Menu クラスを使用し、メニューの要素を作成するにはMenuItem クラスを使用します。 MenuItemを入れ子にするとサブメニューを作成することが
[] ショートカットキーのためのKeyBinding付き拡張MenuItem – Qiita
ショートカットキーのためのKeyBinding付き拡張MenuItem - Qiita
#概要利便性を考えて、アプリで特定のMenuItemにキーボードショートカット(ex. Ctrl+Oで「開く」)を導入することがよくあります。しかし、WPF標準のMenuItemではKeyGes…
[] C#でWPF学習中「ICommand」 | 迷惑堂本舗
C#でWPF学習中「ICommand」
Viewにあるボタンを押すとメッセージボックスを表示するサンプルになります。 実行環境 Windows10 2004 dotnet --version 5.0.102 Visual Studio Code プロジェクトの作成 mkdir W
[] ICommand インターフェイス (System.Windows.Input) | Microsoft Docs
ICommand インターフェイス (System.Windows.Input)
コマンドを定義します。
[] ICommand.Execute(Object) メソッド (System.Windows.Input) | Microsoft Docs
ICommand.Execute(Object) メソッド (System.Windows.Input)
コマンドが起動される際に呼び出すメソッドを定義します。
[] MVVMで引数があるCommandを実装する – Memento
MVVMで引数があるCommandを実装する
よくわすれるので自分用のメモ。タイトルのようなことをやる場合は次のようにやります。こういうのやりたい
コメント