2017-04-24 154 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关于精度/准确 –