毎回忘れる+ググってもすぐに見つからないのでメモとして残します
(ReactiveProperty 使ってます)
注意:
特定のキー押下で処理を行いたい場合は、本内容ではありません。別のやり方(KeyBinding を使う)です。
(例:ESCを押下で画面を閉じる、4押下で左に移動するなど…)
やりたいこと:
・WPF + MVVM で キー押下処理の実装
・どのキーが押されたかで処理を変更する
・要するにKeyDown イベントと同じことがしたい
ポイント:
「PassEventArgsToCommand="True"」これが無いとMVVMでは受信できない。
てかデフォルトtrueにしとけや と思ったり思わなかったり…
デフォルトtrueにするとイベントが発生しないとかなりそうな…
実装:
XAML
ViewModel:
フィールド:
コンストラクタ:
メソッド:
(ReactiveProperty 使ってます)
注意:
特定のキー押下で処理を行いたい場合は、本内容ではありません。別のやり方(KeyBinding を使う)です。
(例:ESCを押下で画面を閉じる、4押下で左に移動するなど…)
やりたいこと:
・WPF + MVVM で キー押下処理の実装
・どのキーが押されたかで処理を変更する
・要するにKeyDown イベントと同じことがしたい
ポイント:
「PassEventArgsToCommand="True"」これが無いとMVVMでは受信できない。
てかデフォルトtrueにしとけや と思ったり思わなかったり…
デフォルトtrueにするとイベントが発生しないとかなりそうな…
実装:
XAML
<UserControl … xmlns:i="http://schemas.microsoft.com/xaml/behaviors" …/> <i:Interaction.Triggers> <i:EventTrigger EventName="KeyDown"> <i:InvokeCommandAction Command="{Binding KeyDownAllCommand}" PassEventArgsToCommand="True"/> </i:EventTrigger> </i:Interaction.Triggers>
ViewModel:
フィールド:
public ReactiveCommand<KeyEventArgs> KeyDownAllCommand { get; private set; }
コンストラクタ:
KeyDownAllCommand = new ReactiveCommand<KeyEventArgs>().WithSubscribe(KeyDown).AddTo(Disposables);
メソッド:
private void KeyDown(KeyEventArgs keyArgs) { _logger.Debug(keyArgs.Key); }