【问题标题】:Mouse wheel and delay between checking for changed value events鼠标滚轮和检查更改值事件之间的延迟
【发布时间】:2012-07-27 21:22:10
【问题描述】:

对于轨迹栏和数字向上/向下(除其他外),每当值更改时触发的事件似乎在更改之间具有非常短的延迟。

这对我来说是个问题,因为每当值发生变化时,我都会执行一些需要相当长的时间来处理的函数(例如,大约 100-200 毫秒,具体取决于输入的大小)

我注意到,当我使用鼠标滚轮增加/减少值时,它会注册 4 个更改事件(打印“更改!” 4 次到调试控制台),因此函数执行了 4 次。这可能是我的鼠标滚轮的设置。

即使我手动单击轨迹栏以使其“大幅增加”,它也会注册 2 个更改事件。

我希望函数在值更改时运行,但不要到单个鼠标滚轮滚动触发 4 次调用的地步。我只需要最新的值。

一种解决方案是强制用户手动按下按钮来执行命令,但我想要某种“实时”更新。

【问题讨论】:

    标签: c# winforms


    【解决方案1】:

    让数字控件的事件设置一个标志。添加一个Timer 控件,每 500 毫秒运行一次,它检查标志,如果设置,则调用实际方法并清除标志。如果要确保处理最后一个值集,请清除标志 first。

    【讨论】:

    • 谢谢,有一个明确的计时器是一种有趣的方式。
    【解决方案2】:

    扩展了 Jon of All Trades 的建议..

    使用DateTime?,而不是简单的标志。当事件触发时,设置eventLastTriggered = DateTime.Now。然后在计时器的 Tick 处理程序中执行此操作

    private void timer_Tick(object sender, EventArgs e)
    {
        if (eventLastTriggered.HasValue
            && (DateTime.Now - eventLastTriggered.Value) >= UpdateDelay)
        {
            eventLastTriggered = null; // reset it so we don't update again
            Update();
        }
    }
    
    static readonly TimeSpan UpdateDelay = TimeSpan.FromMilliseconds(whatever);
    

    您会收到持续的更新延迟,但不会收到更新垃圾邮件。您可以调整 UpdateDelay 以获得最佳结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2013-09-23
      • 2021-03-07
      • 1970-01-01
      相关资源
      最近更新 更多