【WPF】KeyBindingの方法色々

WPFで開発しているアプリケーションで、ショートカットキーをユーザが設定できるようにする(=固定値にできない)という仕様がありました。
どうすれば実現できるか、WPFにおけるショートカットキーの設定方法、もといKeyBindingの方法について色々調べたのでまとめておきます。

前提:WPFの概要

今回のプロジェクトは、PrismとReactivePropertyによってViewとViewModel間のやりとりをするものですが、本題とは関係ないので割愛します。
軽く動作の説明すると、ViewModelのCommandを呼ぶと、画面のテキストがYesとNoで切り替わるというものです。
全体のコードはこちら

MainWindow.xaml

MainWindowViewModel.cs

① xamlファイルで指定

Viewの.xamlファイルに記載するケース。
キーの割り当てが決まっていて、変わることがない場合には、この方法が一番良いと思います。

<Window.InputBindings>および<KeyBinding>タグを記載して、KeyBindingのオプションでキーの指定および呼び出すコマンドを指定します。
キーの指定はKeyオプションを使用し、Alt・Control・Shift・WindowsのModifierKeys(修飾キー)も合わせて指定したい場合はModifiersオプションも使用します。
Gestureオプションでキーと修飾キーをまとめて設定できる場合もあるのですが、どんな組み合わせでも使えるわけではないようです(後述します)。

② コードバインディングでKeyBindingする

①のxamlで行ったことを、コードバインディング(xaml.csファイル)で記述する場合です。
設定ファイルを読み込んでキーを指定する場合など、何かしら可変にする必要がある場合はこちらを使用することになると思います。

KeyBindingのインスタンスを作成し、各プロパティでキーやコマンドを指定します。使用するプロパティは先ほどと同様にKeyおよびModifiers、またはGestureです。
なお、こちらもGestureで指定できる組み合わせとできない組み合わせがあるようです。

③ KeyDownイベントを使用

キーの押下をKeyDownイベントで拾い、押されたキーやキーの組み合わせが合致しているかメソッド内で判定するという方法です。

キーは、KeyEventArgsのKeyプロパティから押されているキーを取得するか、Keyboard.IsKeyDownで指定したキーが押下されているか否かを取得します。
修飾キーは、Keyboard.Modifiersで取得します。
なお、この方法ではModifierKey同士を複数指定することはできるのですが、複数の修飾キーと非修飾キーを指定することはできないようです。

この方法は前2つと異なり、修飾キーでないキーを複数押したときという条件が使用できます。そういった条件が必要なケースでは、この方法を使うことになると思います(そんな状況があるか分かりませんが)。

留意点

既に述べているように、Gestureでは指定できない組み合わせがあります(例えばHキーとShiftキーなど)。
なぜ指定できないのか、指定できる・できない組み合わせが何なのかは軽く調べただけでは分かりませんでした……。

KeyプロパティとModifierプロパティでそれぞれ指定すれば問題ないので、基本的にはGestureプロパティを使用せず、KeyとModifierを使用するようにすべきだと思います。

おまけ:設定ファイルでショートカットキーを指定する

設定ファイルとして、以下のような、キーの組み合わせとコマンドを指定するxmlファイルを作成します。
Key属性に、指定するキーの組み合わせを+で連結し、Valueには、コマンドの動作を区別するための値を指定します。

shortcut.xml

このxmlファイルを読み込んで、値を解析し、『② コードバインディングでKeyBindingする』を行っていきます。
なおEnum.Parseを使って文字列を列挙子の値に変換する都合上、Key属性で指定するキーは、Enumで指定されている名前にする必要があります(例えば数字の0ならD0、コントロールキーなら Ctrl ではなく Control といった具合)。

以上、WPFのKeyBinding方法でした。

コメント

タイトルとURLをコピーしました