なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

MVVMなWPFアプリケーションでボタンを「押した」「離した」の情報をキャッチする

各種装置と連携したアプリを作るとよく出くわす機能としてボタンを押したらモータを回転させ、ボタンを離すまで回転は持続するという機能です。

Jog動作というヤツですね。

これもWinFormsなどでは特に深く考えなくてもボタンを押した時のイベントと離した時のイベントを作り、その中で該当する処理を行えばいいだけです。

ReactiveCommandを用いたサンプルではボタンのCommandにBindingした例(Clickイベントと同じ挙動)はいっぱいありますが、「押した」「離した」時の例は全然見つかりません。(さすがWPF!)

基本的には他のコントロールと同じ手法でイベントにReactiveCommandをBindingすればいいだけなので、手法を知っている人なら何てことない話です。

今回も最低限度必用な記述だけを掲載しますが、全貌は下記リンクを参照してください。

【XAML】

<Window...>の中に下記2行を追加

xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:ri="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.NET46"

<Button...>

</Button>の中に下記8行を追加

<i:Interaction.Triggers>
    <i:EventTrigger EventName="PreviewMouseDown">
        <ri:EventToReactiveCommand Command="{Binding ButtonDownCommand}"/>
    </i:EventTrigger>
    <i:EventTrigger EventName="PreviewMouseUp">
        <ri:EventToReactiveCommand Command="{Binding ButtonUpCommand}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>

PreviewMouseDownやPreviewMouseUpはWinFormsでも見るイベント名ですね。

このイベントにReactiveCommandをBindingすれば、イベントをキャッチできます。

【ViewModel】

変数宣言

public ReactiveCommand ButtonDownCommand { get; } = new ReactiveCommand();
public ReactiveCommand ButtonUpCommand { get; } = new ReactiveCommand();

コンストラクタで

ButtonDownCommand.Subscribe(ButtonDownEvents).AddTo(Disposable);
ButtonUpCommand.Subscribe(ButtonUpEvents).AddTo(Disposable);

イベントが発生した時に実行されるメソッド

private void ButtonDownEvents()
{

}

private void ButtonUpEvents()
}

}

手法さえ覚えてしまえば他のコントロールのイベントも同じようにキャッチできると思います。