各種装置と連携したアプリを作るとよく出くわす機能としてボタンを押したらモータを回転させ、ボタンを離すまで回転は持続するという機能です。
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メソッドに登録されたメソッドが実行されます。
手法さえ覚えてしまえば他のコントロールのイベントも同じようにキャッチできると思います。
0 件のコメント:
コメントを投稿