2017-04-24 136 views
0

嗨我正在寫一個Scoreboard UWP應用程序,我想知道如何使代碼隱藏在計時器後面。因爲是一個籃球記分牌,它有2個時鐘,一個只有秒(shotclock),另一個管理分鐘和秒。 所以,我想知道是否有一種簡單的方法可以在UWP中進行這種倒計時。如何製作倒數計時器?

我剛剛發現這一點,但它不倒計數:

private void stopwatch_Tapped(object sender, TappedRoutedEventArgs e) 
    { 
     if (_stopwatch.IsRunning) 
     { 
      _stopwatch.Stop(); 
      _timer.Dispose(); 
     } 
     else 
     { 
      _stopwatch.Start(); 
      _timer = new Timer(updateTime, null, (int)TimeSpan.FromMinutes(1).TotalMinutes, Timeout.Infinite); 
     } 

    } 

    private async void updateTime(object state) 
    { 
     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
      () => 
       { 

        stopwatchLbl.Text = String.Format("{0:00}:{1:00}:{2:00}", _stopwatch.Elapsed.TotalMinutes, _stopwatch.Elapsed.TotalSeconds, _stopwatch.Elapsed.TotalMilliseconds/10); 

        //stopwatchLbl.Text = "00:00:00"; 

       } 
      ); 

    } 
+2

到目前爲止,您嘗試了什麼?提供研究的證據... –

+0

是的我做了大量的研究,但我沒有發現任何有用的UWP,只有計時但沒有失敗的計時器...... idk –

回答

1

您可以使用UWPHelper.Utilities.ThreadPoolTimer從我NuGet包UWPHelper。您需要檢查NuGet Package Manager中的Include pre-release複選框才能下載它。

我的ThreadPoolTimerSystem.Threading.Timer的包裝類,它的工作方式與DispatcherTimer類似,但是它運行在ThreadPool上,而不是在UI線程上運行。

using UWPHelper.Utilities; 

// TimeSpan indicates the interval of the timer 
ThreadPoolTimer timer = new ThreadPoolTimer(TimeSpan.FromSeconds(1)); 
timer.Tick += OnTick; 

void OnTick(object sender, EventArgs e) 
{ 
    // Method invoked on Tick - every second in this scenario 
} 

// To start the timer 
timer.Start(); 

// To stop the timer 
timer.Stop(); 
+0

我不知道如何做部分說「//每秒調用」,I把下面的代碼放在那裏:'ShotClockText.Text = Convert.ToString(shotclocktime - 1);'它只計數1,而不是每秒都有幫助。 –

+0

我已更新我的答案,使其更明顯 –

+0

我不能使它與我的UI這樣工作:(但最後與其他答案一起工作,謝謝無論如何。 –

1

試試這個代碼,我希望這將幫助你:)

internal class countDownTimer 
    { 
     public int enlapsedTime; 
     private DispatcherTimer dispatch; 

     public delegate void MyCallback(); 
     public delegate void MyCallback2(int value); 
     public MyCallback OnStartTime; 
     public MyCallback OnStopTime; 
     public MyCallback OnEndTime; 
     public MyCallback2 OnCountTime; 

     public countDownTimer() 
     { 
      Debug.WriteLine("StopWatch init"); 
      enlapsedTime = 0; 
      dispatch = new DispatcherTimer(); 
      dispatch.Interval = new TimeSpan(0, 0, 1); 
      dispatch.Tick += timer_Tick; 
     } 

     private void timer_Tick(object sender, object e) 
     { 
      enlapsedTime--; 
      Debug.WriteLine(enlapsedTime); 

      if (OnCountTime != null) OnCountTime(enlapsedTime); 

      if (enlapsedTime < 0) 
      { 
       enlapsedTime = 0; 
       dispatch.Stop(); 
       if (OnEndTime != null) OnEndTime(); 
      } 
     } 

     public void Start() 
     { 
      dispatch.Start(); 
      if (OnStartTime != null) OnStartTime(); 
      Debug.WriteLine("iniciar contador"); 
     } 

     public void Stop() 
     { 
      dispatch.Stop(); 
      if (OnStopTime != null) OnStopTime(); 
      Debug.WriteLine("parar contador"); 
     } 

     public bool IsEnabled 
     { 
      get 
      { 
       return dispatch.IsEnabled; 
      } 
     } 

    } 
+0

'DispatcherTimer'運行在UI線程上這不是很準確。 –

+0

感謝這最後工作,我適應它到我的用戶界面,而不是使用調試工具,它只是工作IDK/IDC關於精度/準確 –