質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

1454閲覧

【C#】【Rx】Reactive Extentionsにて、マウスのシングルクリック ダブルクリックの判断

kiwamaru

総合スコア4

Rx.NET

Rx.NETは、リアクティブプログラミングが可能なライブラリの一つ。.NET Framework向けReactive Extensionsライブラリです。マイクロソフト社が初めてRxライブラリとして提供し、ここから多くの言語にRxが移植されるようになりました。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/03/27 06:14

編集2020/03/27 07:20

前提・実現したいこと

Reactive Extentionsにて、マウスのシングルクリック(DownとUpの1セット)を取得したいと思っているのですが、
ダブルクリックとの判別ができません。

現状のソースで、ダブルクリックを行うと、シングルクリックが二回が発生したと判断してしまうので、
それをどうにか回避したいです。

1.MouseDownの後、250ms以内にMouseUpしたらイベント発生 <ここまでは以下のソース

2.ダブルクリックと区別するため、さらにそのあと、250ms以内にMouseDownがあったらイベントを発生させない
この2つ目の実現方法がわからない状態です。

該当のソースコード

C#

1 var mouseLeftDown = Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>( 2 h => (s, e) => h(e), 3 h => MouseLeftButtonDown += h, 4 h => MouseLeftButtonDown -= h); 5 6 var mouseLeftUp = Observable.FromEvent<MouseButtonEventHandler, MouseButtonEventArgs>( 7 h => (s, e) => h(e), 8 h => MouseLeftButtonUp += h, 9 h => MouseLeftButtonUp -= h); 10 11 mouseLeftDown 12 .SelectMany(_ => mouseLeftUp 13 .TakeUntil(Observable.Timer(TimeSpan.FromMilliseconds(250.0)))) 14 .Subscribe(x => { 15 System.Diagnostics.Debug.WriteLine("single click"); 16 }); 17

試したこと

・MouseButtonEventArgsのClickCountで判断 常に1で変化なし
・後ろに.Throttle(TimeSpan.FromMilliseconds(250.0))をつけるとダブルクリック時に1回だけイベントが発生

mouseLeftDownをBuffer(Timespan)でためて、カウントしてみたのですが、クリック数は取れるのですが、Upとセットじゃないのと、クリック数のカウントが安定しないため使えませんでした。

C#

1 .Buffer(TimeSpan.FromMilliseconds(250.0)) 2 .Select(x => x.Count()) 3 .DistinctUntilChanged()

いただいた情報をもとにそのまま移植してみたところ、クリック数は安定しているようです。
ただ、Upとセットじゃないので、もう少し工夫が必要そうです。

C#

1 int count = 0; 2 mouseLeftDown 3 .Select(x => count +=1) 4 .Throttle(TimeSpan.FromMilliseconds(500.0)) 5 .Do(x => count = 0) 6 .Subscribe(q => { 7 System.Diagnostics.Debug.WriteLine("single click:" + q.ToString()); 8 });

補足情報(FW/ツールのバージョンなど)

・.Net Flamework 4.7.2
・WPFアプリケーション

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiwamaru

2020/03/27 07:22

回答ありがとうございました。 "試したこと"の欄に、移植したもののコードを載せました。 ただ、mouse Down+Upのセットではないため、ドラッグ時にも発生してしまうのがネックです。
Zuishin

2020/03/27 07:39

セットにしたらどうでしょう。 var singleClick = mouseLeftDown .SelectMany(_ => mouseLeftUp.TakeUntil(Observable.Timer(TimeSpan.FromMilliseconds(250)))); int count = 0; singleClick .Select(_ => count++) .Throttle(TimeSpan.FromMilliseconds(500)) .Do(_ => count = 0) .Subscribe(a => { switch (a) { case 0: Debug.WriteLine("clicked"); break; case 2: Debug.WriteLine("double clicked"); break; } });
kiwamaru

2020/03/27 07:45

回答ありがとうございました。 期待通りの動作をしました。 Rxはこんな使い方ができるのですね。 もっと勉強したいと思います。
Zuishin

2020/03/27 07:46

これが期待通りであれば自己解決してください。
guest

回答1

0

自己解決

Zuishin様にいただいた以下のコードにて解決しました。ありがとうございました。

C#

1var singleClick = mouseLeftDown 2.SelectMany(_ => mouseLeftUp.TakeUntil(Observable.Timer(TimeSpan.FromMilliseconds(250)))); 3 4int count = 0; 5singleClick 6.Select(_ => count++) 7.Throttle(TimeSpan.FromMilliseconds(500)) 8.Do(_ => count = 0) 9.Subscribe(a => 10{ 11switch (a) 12{ 13case 0: 14Debug.WriteLine("clicked"); 15break; 16case 2: 17Debug.WriteLine("double clicked"); 18break; 19} 20});

投稿2020/03/27 07:53

kiwamaru

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問