當用戶做了一些事情(在這種情況下觸摸一個StackPanel),我需要開始某種計時器(可能是DispatcherTimer,因爲我在WPF中工作),並且如果在一定時間內再次發生另一次觸摸然後我會調用一個方法。正如你可能猜到的 - 這是爲了實現雙擊功能。如何使用線程'勾選'要被其他線程訪問的定時器?
我假設實現這一目標的最佳途徑是通過使用線程(即子線程遞增可以由主線程的StackPanel被再次觸摸隨時檢查時間跨度?)
謝謝,
丹
當用戶做了一些事情(在這種情況下觸摸一個StackPanel),我需要開始某種計時器(可能是DispatcherTimer,因爲我在WPF中工作),並且如果在一定時間內再次發生另一次觸摸然後我會調用一個方法。正如你可能猜到的 - 這是爲了實現雙擊功能。如何使用線程'勾選'要被其他線程訪問的定時器?
我假設實現這一目標的最佳途徑是通過使用線程(即子線程遞增可以由主線程的StackPanel被再次觸摸隨時檢查時間跨度?)
謝謝,
丹
您不需要啓動另一個線程來執行此操作。
只需記下第一次敲擊的時間戳並使用它。然後,您可以通過從當前時間減去這個時間計算時間跨度:
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)) {...}
}
最好的辦法是堅持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");
}
並且不應該需要線程。 – nos
完美。發現。對我來說,一定是早上太早了。給我10分鐘,我會將其標記爲答案。 –
準確地說,我要回答(雖然沒有代碼示例)。 – Nuffin