2017-06-21 42 views
0

所以我有這種情況將GUI對象捕捉到引導線對象。我想要的是讓物體捕捉到位,但如果系統仍然檢測到鼠標移動,那麼我希望該物體不會移動並繼續移動。我有捕捉條件工作,但我在後者失敗。C#使用定時器來切換布爾值

這是我射擊的事件,它是不斷被系統聽取

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 
     } 
     } 
    } 

的問題是,有一個在應用程序,然後變得沒有響應延遲,我必須做強制重啓。有人可以幫我解決這個問題嗎?

+0

我不太確定你在做什麼......你爲什麼要設置'Thread.Sleep(2000)'?這是阻止你的UI線程。 – gilmishal

回答

0

睡覺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秒,如果是,那麼我們想要取消捕捉。等待時

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秒鐘,用戶可以再次移動鼠標,這將再次設置一個等待2秒鐘的新計時器,依此類推;你很可能想要防止多次延遲,但這是對你的一個練習。

+0

我試圖完成的是在x秒數過去後切換布爾值。 –

+0

謝謝你,是的,我目前正在集思廣益,以防止多重延誤 –

0

也許你可以使用另一種方法,例如, UIElement.IsMouseOver,以滿足鼠標光標懸停在某個對象上?那麼你不需要睡任何線程。

如前所述,您的問題不是很清楚的大圖。