基本上我要说我正在制作一个简单的计数器,当我点击鼠标时,计数器会上升。我的问题是如何对一个偶数程序进行编程,这使得我可以在我按住鼠标的同时让计数器流动,基本上就像KeyPress事件处理程序一样,仅使用鼠标。
答案 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
事件以暂停或停止计时器。执行计时器过去时要触发的代码。