[英]Why is this double-click detection code unreliable?
我试图通过一些简单的挑战来学习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之后都会打印出来,以便我知道何时应该注册双击。
总体来说,这似乎效果很好,但即使我看到“现在接受双击!”,有时他们也没有注册。 信息。 尤其是如果我在出现消息之前单击,这似乎会发生。 是什么原因造成的?
编辑:我认为双击检测实际上是正确的,这是不正确的消息。 基本上,它会忽略双击后的任何后续单击。 我需要做类似的事情
但我不确定如何实现...
因此,正如我怀疑的那样,检测代码是正确的,这是消息的计时不正确。 双击后未考虑任何后续点击; 每次双击后始终仅在1000毫秒内打印其消息。 这是就绪消息的版本,该消息正确地等待每次双击后的最后一次单击以来已经经过1000毫秒:
var doubleClickReady = doubleClicks
.SelectMany(clickEvents
.Buffer(interClickInterval)
.FirstAsync(b => b.Count == 0));
doubleClickReady
.Subscribe(e => Console.WriteLine("Now accepting double click!"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.