为什么这个双击检测代码不可靠?

时间:2014-05-17 20:48:18

标签: c# wpf system.reactive

我试图通过一些简单的挑战来学习Rx,首先通过仅观看MouseUp事件来检测双击。我提出了以下解决方案(此代码可通过创建WPF项目并添加Reactive Extensions NuGet包进行编译):

using System;
using System.Reactive.Linq;
using System.Windows.Input;

namespace WpfApplication1 {
    public partial class MainWindow {
        public MainWindow() {
            InitializeComponent();
            var clickEvents = Observable
                .FromEventPattern<MouseButtonEventArgs>(this, "MouseLeftButtonUp");

            var intraClickInterval = TimeSpan.FromMilliseconds(500);
            var interClickInterval = TimeSpan.FromMilliseconds(1000);

            var doubleClicks = clickEvents
                .TimeInterval()
                .SkipWhile(t => t.Interval < interClickInterval)
                .FirstAsync(t => t.Interval < intraClickInterval)
                .Repeat();

            var doubleClickReady = doubleClicks
                .Delay(interClickInterval)
                .Subscribe(e => Console.WriteLine("Now accepting double click!"));

            doubleClicks.Subscribe(e => Console.WriteLine(e.Interval));
        }
    }
}

我见过的大多数解决方案都没有处理多次点击,所以我们的想法是每次双击之间总是等待一定的间隔(interClickInterval),然后双击就是下一次鼠标悬停事件,其间隔小于intraClickInterval。我还添加了一条消息,在每次双击后经过interClickInterval后打印,以便我知道双击应该注册的时间。

这似乎总体上运作良好,但似乎有时它们没有注册,即使我看到&#34;现在接受双击!&#34;信息。如果我在消息出现之前单击,这似乎就会发生。可能导致这种情况的原因是什么?

编辑:我认为双击检测实际上是正确的,它是不是的消息。基本上,它会在双击后忽略任何后续点击。我需要做像

这样的事情
    每次双击事件
  • 等待interClickInterval
  • 如果之后没有注册点击,则显示&#34;现在接受双倍 单击&#34; <!/ LI>

但我不确定如何实现......

1 个答案:

答案 0 :(得分:1)

因为我怀疑,检测代码是正确的,这是错误定时的消息。双击后没有考虑任何后续点击;它只是在每次双击后始终打印1000ms的消息。这是一个就绪消息的版本,正好等待每次双击后最后一次点击后经过1000毫秒:

        var doubleClickReady = doubleClicks
            .SelectMany(clickEvents
                .Buffer(interClickInterval)
                .FirstAsync(b => b.Count == 0));

        doubleClickReady
            .Subscribe(e => Console.WriteLine("Now accepting double click!"));