3

これを行う簡単な方法があることは知っていますが、今夜は私を打ち負かしました...

ダブルクリックのように、2 つのイベントが 300 ミリ秒以内に発生するかどうかを知りたいです。

300 ミリ秒で 2 回のマウスの左クリック - これがリアクティブ フレームワークが構築された目的であることは知っていますが、すべての拡張演算子 (Throttle、BufferWithCount、BufferWithTime) の簡単な例を含む優れたドキュメントを見つけることができれば気になります。 '私のためにやっている....

4

2 に答える 2

9

このTimeIntervalメソッドは、値間の時間を提供します。

public static IObservable<Unit> DoubleClicks<TSource>(
    this IObservable<TSource> source, TimeSpan doubleClickSpeed, IScheduler scheduler)
{
    return source
        .TimeInterval(scheduler)
        .Skip(1)
        .Where(interval => interval.Interval <= doubleClickSpeed)
        .RemoveTimeInterval();
}

トリプルクリックが値をトリガーしないことを確認したい場合はRepeat、ホットオブザーバブルで使用できます(FastSubjectクリックはすべて1つのスレッドで発生するため、通常の重さを必要としないため、ここで a を使用しました科目):

public static IObservable<TSource> DoubleClicks<TSource>(
    this IObservable<TSource> source, TimeSpan doubleClickSpeed, IScheduler scheduler)
{
    return source.Multicast<TSource, TSource, TSource>(
        () => new FastSubject<TSource>(), // events won't be multithreaded
        values =>
        {
            return values
                .TimeInterval(scheduler)
                .Skip(1)
                .Where(interval => interval.Interval <= doubleClickSpeed)
                .RemoveTimeInterval()
                .Take(1)
                .Repeat();
        });
}
于 2011-03-08T08:18:12.457 に答える
3

編集 -TimeInterval()代わりに使用します。

オペレーターはZip() and Timestamp()良いスタートかもしれません。

var ioClicks = Observable.FromEvent<MouseButtonEventHandler, RoutedEventArgs>(
                                        h => new MouseButtonEventHandler(h),
                                        h => btn.MouseLeftButtonDown += h,
                                        h => btn.MouseLeftButtonDown -= h);
var ioTSClicks = ioClicks.Timestamp();

var iodblClicks = ioTSClicks.Zip(ioTSClicks.Skip(1), 
                                 (r, l) => l.Timestamp - r.Timestamp)
                            .Where(tspan => tspan.TotalMilliseconds < 300);

おそらく、テストスケジューラを介してこれをテストするのが最善であるため、何が得られるかを正確に知ることができます。

[Fact]
public void DblClick()
{
    // setup
    var ioClicks = _scheduler.CreateHotObservable(
                     OnNext(210, "click"),
                     OnNext(220, "click"),
                     OnNext(300, "click"),
                     OnNext(365, "click"))
                     .Timestamp(_scheduler);

    // act
    Func<IObservable<TimeSpan>> target = 
        () => ioClicks.Zip(ioClicks.Skip(1), 
                          (r, l) => l.Timestamp - r.Timestamp)
                        .Where(tspan => tspan.Ticks < 30);
    var actuals = _scheduler.Run(target);

    // assert
    Assert.Equal(actuals.Count(), 1);
    // + more
}
public static Recorded<Notification<T>> OnNext<T>(long ticks, T value)
{
    return new Recorded<Notification<T>>(
        ticks, 
        new Notification<T>.OnNext(value));
}
于 2011-03-08T04:53:02.400 に答える