基本上假设我正在制作一个简单的计数器,当我单击鼠标时,计数器会上升。我的问题是如何编写一个偶数程序,使我可以在按住鼠标的同时使计数器流动,基本上与 KeyPress 事件处理程序完全一样,仅使用鼠标。
3 回答
如果您出于其他原因不需要运行计时器,我不会使用计时器。我会使用类属性或全局变量,具体取决于您在做什么。
private/public startTicks long = 0;
当您触发 MouseDown 事件时:
startTicks = DateTime.Now.Ticks;
在 MouseUp 事件中,获取差异并将其转换为您想要的任何时间元素(分钟、秒、小时)。
DoConversion(DateTime.Now.Ticks - startTicks);
我将建议一个基于使用Microsoft 的 Reactive Framework (Rx)的解决方案。
我假设MouseDown
&MouseUp
事件基于单击表单,并且有一个NumericUpDown
控件,我们希望在鼠标按下时每 0.1 秒递增一次。
这是对解决方案进行编码的反应式框架方式:
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 学习起来可能有点棘手,但是一旦你掌握了它,它就会非常强大。我用它所有的时间。
定义一个在事件发生时开始触发其事件的计时器MouseDown
。然后将MouseUp
事件设置为暂停或停止计时器。执行您希望在计时器结束时触发的代码。