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

2019/11/07

C# 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>

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()
{
}

XAMLにある「PreviewMouseDown」イベントが発生すると変数で宣言された「ButtonDownCommand」に伝わり「PreviewMouseUp」イベントが発生すると「ButtonUpCommand」に伝わり、コンストラクタの各変数のSubscribeメソッドに登録されたメソッドが実行されます。

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

自己紹介

自分の写真



新潟県のとある企業で働いてます。
【できる事】
電子回路設計
基板パターン設計
マイコンプログラム
C#(WinForms WPF)を使ったWindowsアプリケーション作成
PLCラダー
自動化装置アドバイザー
にほんブログ村 IT技術ブログ ソフトウェアへ

カテゴリ

このブログを検索

QooQ