キーボードショートカットを付ける

公式の方法

UWPの公式キーボードショートカットの方法はGridのKeyDownイベントをとってねという感じです。

なにやらAutomationPropertiesとかの方法もあるらしいですがよくわからないです。

Gridが(理想のタイミングで)フォーカスを受け取れない

受け取れないわけではないですが、例えばGridをクリックしてもGridのGotFocusイベントは発生しません。

Gridの子要素にTextBoxなど、フォーカスが当たるものにフォーカスがあったとき、GridのGotFocusイベントが発生します。

Gridにフォーカスが当たってないとKeyDownイベントが発生しないのですが子要素のTextBoxにフォーカスがあたってるときにショートカット発動してもうれしくないし誤動作の原因になります。

Dispatcher.AcceleratorKeyActivatedイベントを使う

Dispatcher.AcceleratorKeyActivatedイベントを使うと、現在のDispatcher内で押されたキーをすべて検知することができます。

しかしこれ単体で動かすと、例えばショートカットを適用したいGridからフォーカスがはずれて、別のページに行ったときもショートカットが発動してしまいます。

つまりDispatcher.AcceleratorKeyActivatedイベントでキーを検知したとき、Gridに(理想的な)フォーカスが当たっていればショートカットを発動すればよいわけです。

Gridのショートカットキー的に理想なフォーカスイベント

ではGridの理想的なフォーカスイベントとは何かというと調べた感じたぶんこれぐらいだとおもいます。

PointerPressedはGridをクリックしたときに発動するので理想的なフォーカスといえます。

Unloadedはもし別のページに遷移した、現在のXAMLページが破棄されるなどのときに必要になります。

GotFocusイベントは引数のOriginalSourceを見て、もしGridならフォーカスを、もしGridじゃない(例えば子要素のTextBoxなど)ならフォーカスをあてないことによってテキストボックス入力中にショートカットが発動することを防ぎます。

ビヘイビアを使う

いちいちGridのイベントをとっていてはめんどくさいので自作ビヘイビアを作って簡単にしましょう。

ビヘイビアを自作するためにはBehaviorSDKを参照する必要があります。

作ったビヘイビアがこちらになります。コピペすれば使えます。

使い方

Pageタグの属性にxmlnsを付け加えます。

あとはショートカットキーを適用したいFrameworkElementの子要素にこれを入れるだけ

Aキーを押すとバインドされているコマンドが発動します。

イベントも用意してるのでOnShortcutDownイベントをフックするとコードビハインドから簡単に使えます。

以下の場合はControl + A

KeyやModifierKeyもVirtualKeyとしてDependencyPropertyで公開してるのでモデルとバインドすれば簡単にショートカットを変更できますし、変更結果を保存できます。