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

C# 为什么这个双击检测代码不可靠?,c#,wpf,system.reactive,C#,Wpf,System.reactive,我试图通过一些简单的挑战来学习Rx,首先通过只观看鼠标点击事件来检测双击。我提出了以下解决方案(此代码可通过创建WPF项目并添加反应式扩展NuGet包进行编译): 使用系统; 使用System.Reactive.Linq; 使用System.Windows.Input; 命名空间WpfApplication1{ 公共部分类主窗口{ 公共主窗口(){ 初始化组件(); var clickEvents=可观察 .FromEventPattern(这是“MouseLeftButtonUp”); var

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

使用系统;
使用System.Reactive.Linq;
使用System.Windows.Input;
命名空间WpfApplication1{
公共部分类主窗口{
公共主窗口(){
初始化组件();
var clickEvents=可观察
.FromEventPattern(这是“MouseLeftButtonUp”);
var InclickInterval=时间跨度(从毫秒算起)(500);
var interClickInterval=TimeSpan.From毫秒(1000);
var doubleClicks=clickEvents
.TimeInterval()
.SkipWhile(t=>t.Intervalt.IntervalConsole.WriteLine(“现在接受双击!”);
双击.Subscribe(e=>Console.WriteLine(e.Interval));
}
}
}
我见过的大多数解决方案都不会处理多次单击,因此我们的想法是在每次双击之间始终等待一定的间隔(单击间隔),然后双击是下一个鼠标向上移动事件,其间隔小于单击间隔。我还添加了一条消息,在每次双击后的点击间隔结束后打印出来,这样我就知道双击应该在什么时候注册

总的来说,这似乎工作得很好,但有时他们似乎没有注册,即使我看到“现在接受双击!”消息。这似乎会发生,尤其是当我在消息出现之前单击时。这可能是什么原因造成的

编辑:我认为双击检测实际上是正确的,而不是消息。基本上,它会忽略双击后的任何后续单击。我需要做一些类似的事情

  • 对于每个双击事件
  • 等待间隔时间
  • 如果此后未注册任何单击,则显示“现在接受双击” 点击!“

但我不确定如何实现这一点…

因此,正如我所怀疑的,检测代码是正确的,是消息的时间不正确。它没有考虑双击之后的任何后续点击;它总是在每次双击1000毫秒后打印消息。以下是ready消息的一个版本,该消息自每次双击后的最后一次单击后正确等待1000毫秒:

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

        doubleClickReady
            .Subscribe(e => Console.WriteLine("Now accepting double click!"));
        var doubleClickReady = doubleClicks
            .SelectMany(clickEvents
                .Buffer(interClickInterval)
                .FirstAsync(b => b.Count == 0));

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