C#使用计时器切换布尔值

时间:2017-06-21 15:32:12

标签: c# events

所以我有这个条件将GUI对象捕捉到引导线对象。我想要的是对象捕捉到位,但如果系统仍然检测到鼠标移动,那么我希望该对象解除锁定并继续移动。我有抢购条件,但我对后者失败了。

这是我正在开火的事件,并且系统一直在监听它

private void UserControl_MouseMove(object sender, MouseEventArgs e)
    {
      if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element
      {
        if (snappedVertically)
        {
          Thread.Sleep(2000); //wait 2 seconds...
          snappedVertically = false; //...then unsnap
        }
      }
    }

问题是应用程序中存在延迟,然后无响应,我必须重新启动。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

睡眠UI线程是导致无响应的原因。

只需比较事件的时间即可解决您的问题:

DateTime _lastEventTime = DateTime.MinValue;

private void UserControl_MouseMove(object sender, MouseEventArgs e)
{
    if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element
    {
        if (snappedVertically)
        {
            if ((DateTime.Now - _lastEventTime) < TimeSpan.FromSeconds(2))
            {
                snappedVertically = false;
            }
        }
    }

    _lastEventTime = DateTime.Now;
}

你的问题在期望的行为上并不十分清楚,但在这里,我们记录每次射击后的最后一次事件时间,然后如果我们垂直拍摄,检查最后一次事件是否发生在2秒前,如果它确实如此,然后我们想要解开。

更新

根据澄清问题意图的评论,您可以轻松地在2秒后切换值:

private async void UserControl_MouseMove(object sender, MouseEventArgs e)
{
    if (IsMouseCaptured && snappedVertically) //The IsMouseCaptured listens for mouse movement and snapped vertically is what I am using to snap the GUI element
    {
        if (snappedVertically)
        {
            await Task.Delay(2000);
            snappedVertically = false;
        }
    }
}

请注意,因为很明显在等待那2秒时,用户可以再次移动鼠标,这将再次设置一个等待2秒的新计时器,依此类推;你很可能想要防止多次延误,但这对你来说是一种练习。

答案 1 :(得分:0)

也许您可以使用其他方法,例如UIElement.IsMouseOver,以满足鼠标光标悬停在某个对象上?那你就不需要睡任何线程了。

如前所述,你的问题不是很清楚大局。