前提・実現したいこと
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アプリケーション
回答1件
あなたの回答
tips
プレビュー