C# WPF + MVVM でキー押下処理の実装
毎回忘れる+ググってもすぐに見つからないのでメモとして残します
(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);
}
/**********************************************************************************
本記事はGooブログから作成者本人が移行しました。
**********************************************************************************/
コメント
コメントを投稿