WPF - アクセラレータキーとショートカットキー

アクセラレータキー

ファイル(F)のようなもの。エクスプローラとかのメニューにある。 f:id:kewin:20180608205557j:plain

Altキーを押すと入力待ち状態になるので、その後Fを押せば、うえの例だとファイルのメニューアイテムが開く。 キーボードから手を離したくない人向け。

WPFでの書き方はXamlに書くだけ。 MenuItemのheader名に(_F)などを付与する。

<Menu HorizontalAlignment="Left" Height="21" VerticalAlignment="Top">
    <MenuItem Header="ファイル(_F)"/>
    <MenuItem Header="編集(_E)"/>
    <MenuItem Header="表示(_V)"/>
</Menu>

ショートカットキー

テキストエディタとかでCtrl+sで保存できたりするやつ。 これもXamlに書くだけ。

<Window.InputBindings>
    <KeyBinding Command="{Binding sampleCommand}" Key="Delete"/>
    <KeyBinding Command="{Binding sample2Command}" Gesture="Ctrl+o"/>
</Window.InputBindings>

この例だと、deleteキーを押すとViewModelのsampleCommandが動く。 Ctrl+oを押すとsampleCommand2が動く。 キーの割り当てはkeyでもGestureでもよいが、Keyだと同時押しを設定するときにもう少し記載がいる。

ただ、この例だとWindowにフォーカスがないと反応しない。 例えばWindow内のDatagridとかにフォーカスがあると反応しない。 なので反応させたいところに記載するとよい。

<Datagrid.InputBindings>
    <KeyBinding Command="{Binding sampleCommand}" Key="Delete"/>
    <KeyBinding Command="{Binding sample2Command}" Gesture="Ctrl+o"/>
</Datagrid.InputBindings>

こうなると複数個所で同じキーバインドを記載することになりそうだけど(Windowと、他のコントロール)、 リソースにまとめて指定とかできないかな??