2

基本上假设我正在制作一个简单的计数器,当我单击鼠标时,计数器会上升。我的问题是如何编写一个偶数程序,使我可以在按住鼠标的同时使计数器流动,基本上与 KeyPress 事件处理程序完全一样,仅使用鼠标。

4

3 回答 3

2

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

private/public startTicks long = 0;

当您触发 MouseDown 事件时:

startTicks = DateTime.Now.Ticks;

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

DoConversion(DateTime.Now.Ticks - startTicks);
于 2012-10-27T21:44:48.390 回答
1

我将建议一个基于使用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>>SubscribeSwitchIObservable<long>

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

Rx 学习起来可能有点棘手,但是一旦你掌握了它,它就会非常强大。我用它所有的时间。

于 2012-10-28T00:33:21.777 回答
0

定义一个在事件发生时开始触发其事件的计时器MouseDown。然后将MouseUp事件设置为暂停或停止计时器。执行您希望在计时器结束时触发的代码。

于 2012-10-27T21:13:15.520 回答