2012-01-25 64 views
2

當用戶做了一些事情(在這種情況下觸摸一個StackPanel),我需要開始某種計時器(可能是DispatcherTimer,因爲我在WPF中工作),並且如果在一定時間內再次發生另一次觸摸然後我會調用一個方法。正如你可能猜到的 - 這是爲了實現雙擊功能。如何使用線程'勾選'要被其他線程訪問的定時器?

我假設實現這一目標的最佳途徑是通過使用線程(即子線程遞增可以由主線程的StackPanel被再次觸摸隨時檢查時間跨度?)

謝謝,

回答

6

您不需要啓動另一個線程來執行此操作。

只需記下第一次敲擊的時間戳並使用它。然後,您可以通過從當前時間減去這個時間計算時間跨度:

private DateTime _lastTap; 
public void TapHandler() 
{ 
    DateTime now = DateTime.UtcNow; 
    TimeSpan span = now - lastTap; 
    _lastTap = now; 
    if (span < TimeSpan.FromSeconds(1)) {...} 
} 

另外,通過@DannyVarod的建議,您可以使用Stopwatch來達到同樣的效果(但有更準確的計時):

private Stopwatch _stopwatch = new Stopwatch(); 
public void TapHandler() 
{ 
    TimeSpan elapsed = _stopwatch.Elapsed; 
    _stopwatch.Restart(); 
    if (elapsed < TimeSpan.FromSeconds(1)) {...} 
} 
+1

並且不應該需要線程。 – nos

+0

完美。發現。對我來說,一定是早上太早了。給我10分鐘,我會將其標記爲答案。 –

+0

準確地說,我要回答(雖然沒有代碼示例)。 – Nuffin

1

最好的辦法是堅持DispatcherTimer,你首先指出,因爲這將確保您不會需要做剔任何線程編組。如果您明確需要準確性和/或後臺線程,請參閱System.Timers.Timer類和System.Threading.Timer類。

允許區分單擊和雙擊的代碼示例可在MSDN(特定於Windows窗體,但原理相同)上找到。或者,請參閱此示例使用DispatcherTimer取自this previous question

private static DispatcherTimer clickTimer = 
     new DispatcherTimer(
      TimeSpan.FromMilliseconds(SystemInformation.DoubleClickTime), 
      DispatcherPriority.Background, 
      mouseWaitTimer_Tick, 
      Dispatcher.CurrentDispatcher); 

    private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     // Stop the timer from ticking. 
     myClickWaitTimer.Stop(); 

     Trace.WriteLine("Double Click"); 
     e.Handled = true; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     myClickWaitTimer.Start(); 
    } 

    private static void mouseWaitTimer_Tick(object sender, EventArgs e) 
    { 
     myClickWaitTimer.Stop(); 

     // Handle Single Click Actions 
     Trace.WriteLine("Single Click"); 
    }