要約
メニュー、子メニューは
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
![](https://www.invisible-works.com/wp01/wp-content/uploads/cocoon-resources/blog-card-cache/c7870e7a8d2a5bcc96508ec844223e38.png)
C#のWPFでメニューを作成する
WPFでメニューを作成する方法について解説します。
[] [WPF] メニューを作成する | HIROs.NET Blog
![](https://www.invisible-works.com/wp01/wp-content/uploads/cocoon-resources/blog-card-cache/fc6868b8ba959150fce90c37c4721487.png)
[WPF] メニューを作成する
本TipsはWPFのみとなります。あらかじめご了承ください。メニューを作成するには Menu クラスを使用し、メニューの要素を作成するにはMenuItem クラスを使用します。MenuItemを入れ子にするとサブメニューを作成することができ
[] ショートカットキーのためのKeyBinding付き拡張MenuItem – Qiita
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-9f5428127621718a910c8b63951390ad.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTkxNiZ0eHQ9JUUzJTgyJUI3JUUzJTgzJUE3JUUzJTgzJUJDJUUzJTgzJTg4JUUzJTgyJUFCJUUzJTgzJTgzJUUzJTgzJTg4JUUzJTgyJUFEJUUzJTgzJUJDJUUzJTgxJUFFJUUzJTgxJTlGJUUzJTgyJTgxJUUzJTgxJUFFS2V5QmluZGluZyVFNCVCQiU5OCVFMyU4MSU4RCVFNiU4QiVBMSVFNSVCQyVCNU1lbnVJdGVtJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmdHh0LWNsaXA9ZWxsaXBzaXMmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1mYThjZGIzOTA5NDUzMzgwMDM4NDgwZTFjZGY3MDc1ZQ&mark-x=142&mark-y=112&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTYxNiZ0eHQ9JTQwc29pJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0xMzQ0MDYyY2JkOTFlNjBiMjhmMGY3YmU3NjdlYmYyOA&blend-x=142&blend-y=491&blend-mode=normal&s=7ce5145bcc8637919e079ebc15327993)
ショートカットキーのためのKeyBinding付き拡張MenuItem - Qiita
#概要利便性を考えて、アプリで特定のMenuItemにキーボードショートカット(ex. Ctrl+Oで「開く」)を導入することがよくあります。しかし、WPF標準のMenuItemではKeyGes…
[] C#でWPF学習中「ICommand」 | 迷惑堂本舗
![](https://www.invisible-works.com/wp01/wp-content/uploads/cocoon-resources/blog-card-cache/6bdccb1d38275beffee9924b0ea5d735.png)
C#でWPF学習中「ICommand」
Viewにあるボタンを押すとメッセージボックスを表示するサンプルになります。実行環境Windows102004dotnet--version5.0.102VisualStudioCodeプロジェクトの作成mkdirWpfSample2But
[] ICommand インターフェイス (System.Windows.Input) | Microsoft Docs
![](https://www.invisible-works.com/wp01/wp-content/uploads/cocoon-resources/blog-card-cache/62becbf9e66edbd7a674a2191e28faef.png)
ICommand インターフェイス (System.Windows.Input)
コマンドを定義します。
[] ICommand.Execute(Object) メソッド (System.Windows.Input) | Microsoft Docs
![](https://www.invisible-works.com/wp01/wp-content/uploads/cocoon-resources/blog-card-cache/62becbf9e66edbd7a674a2191e28faef.png)
ICommand.Execute(Object) メソッド (System.Windows.Input)
コマンドが起動される際に呼び出すメソッドを定義します。
[] MVVMで引数があるCommandを実装する – Memento
![](https://www.invisible-works.com/wp01/wp-content/uploads/cocoon-resources/blog-card-cache/5a3bf563c9001144735461b3b4bd5602.png)
MVVMで引数があるCommandを実装する
よくわすれるので自分用のメモ。タイトルのようなことをやる場合は次のようにやります。こういうのやりたい
コメント