鼠标按住时,多次举起事件

时间:2012-10-27 20:50:33

标签: c# event-handling mouseevent

基本上我要说我正在制作一个简单的计数器,当我点击鼠标时,计数器会上升。我的问题是如何对一个偶数程序进行编程,这使得我可以在我按住鼠标的同时让计数器流动,基本上就像KeyPress事件处理程序一样,仅使用鼠标。

3 个答案:

答案 0 :(得分:2)

如果由于其他原因不需要运行计时器,我就不会使用计时器。我会使用类属性或全局变量,具体取决于你正在做什么。

private/public startTicks long = 0;

当您触发MouseDown事件时:

startTicks = DateTime.Now.Ticks;

在MouseUp事件中,获取差异并将其转换为您想要的任何时间元素(分钟,秒,小时)。

DoConversion(DateTime.Now.Ticks - startTicks);

答案 1 :(得分:1)

我将基于使用Microsoft's Reactive Framework (Rx)建议解决方案。

我认为MouseDown& MouseUp事件基于单击表单,并且有一个NumericUpDown控件,我们希望在鼠标停止时每0.1秒递增一次。

以下是Reactive Framework对解决方案进行编码的方式:

var mouseDowns = Observable.FromEventPattern
    <MouseEventHandler, MouseEventArgs>(
        h => this.MouseDown += h,
        h => this.MouseDown -= h);

var mouseUps = Observable.FromEventPattern
    <MouseEventHandler, MouseEventArgs>(
        h => this.MouseUp += h,
        h => this.MouseUp -= h);

var intervals = Observable.Interval(TimeSpan.FromSeconds(0.1));

var query =
    from md in mouseDowns
    select intervals.TakeUntil(mouseUps);

query.Switch().ObserveOn(this).Subscribe(n => numericUpDown1.Value += 1);

反应性查询应该很容易理解它的用途 - 基本上就是“当你按下鼠标时选择间隔,直到有鼠标向上。”

query的类型为IObservable<IObservable<long>>所以在Subscribe之前我们需要调用Switch将查询转换为IObservable<long>

ObserveOn(this)确保observable的值被编组到UI线程。

Rx学习起来有点棘手,但是一旦你掌握它就会变得非常强大。我一直都在使用它。

答案 2 :(得分:0)

定义在MouseDown事件发生时开始触发事件的计时器。然后设置MouseUp事件以暂停或停止计时器。执行计时器过去时要触发的代码。