2012-04-03 201 views
1

我想知道WPF中的定时器。WPF定时器倒计时

什么,我基本上都知道是如何使一个简单的倒计时器(标签)倒计时这样的代码:

private void buttonStartOne_Click(object sender, RoutedEventArgs e) 
{ 
    counterOne = new DispatcherTimer(); 
    counterOne.Tick += new EventHandler(counterOne_Tick); 
    counterOne.Interval = new TimeSpan(0, 0, 1); 

    counterOneTime = 10; 
    counterOne.Start(); 
} 

private void counterOne_Tick(object sender, EventArgs e) 
{ 
// code goes here 

    if (counterOneTime > 0) 
    { 
     counterOneTime--; 
     labelCounterOne.Content = counterOneTime + "s"; 
    } 
    else 
     counterOne.Stop(); 
} 

在上面这个例子中的代码,倒计时只需10秒。 我想要什么,不知道我应该如何让它变成:HH:mm:ss并且让它倒数。 你会用3个单独的计数器和标签(每个时间单位一个)来做到这一点吗? 或者应该是更好的方法来解决这个问题?

+4

如果有人票-1,甚至不评论为什么总是讨厌... – Dante1986 2012-04-03 21:37:22

+0

我给予好评在这种情况下:) – thumbmunkeys 2012-04-03 21:45:16

回答

1
public class TimeController 
{ 
    private static readonly TimeSpan TimeSpan = new TimeSpan(0, 0, 1); 
    private static int _time; 

    protected static readonly DispatcherTimer Timer = new DispatcherTimer(); 
    protected static readonly DispatcherTimer BeeperTimer = new DispatcherTimer(); 
    protected static readonly Stopwatch StopWatch = new Stopwatch(); 
    protected static Label TimerLabel; 
    protected static Button StartButton; 

    internal static int Time { get { return _time; } set { _time = value; ExtractAndUpdate(); } } 
    internal static bool Countdown { get; set; } 

    /// <summary> 
    /// Static constructor 
    /// </summary> 
    static TimeController() 
    { 
     BeeperTimer.Interval = TimeSpan; 
     BeeperTimer.Tick += BeeperTick; 
     Timer.Interval = TimeSpan; 
     Timer.Tick += TimerTick; 
    } 

    /// <summary> 
    /// Timer tick event method 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private static void TimerTick(object sender, EventArgs e) 
    { 
     if (Countdown) 
      if (Time > 0) 
      { 
       ExtractAndUpdate(); 
       Time -= 1; 
      } 
      else 
      { 
       StopRunning(); 
       BeeperTimer.Start(); 
      } 
     else 
      ExtractAndUpdate(); 
    } 

    /// <summary> 
    /// Start timer and stopwatch 
    /// </summary> 
    protected static void StartRunning() 
    { 
     Timer.Start(); 
     StopWatch.Start(); 
     StartButton.Content = Labels.Pause; 
    } 

    /// <summary> 
    /// Stop timer and stopwatch 
    /// </summary> 
    protected static void StopRunning() 
    { 
     Timer.Stop(); 
     StopWatch.Stop(); 
     StartButton.Content = Labels.Start; 
    } 

    /// <summary> 
    /// Beeper event method and label blinking 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private static void BeeperTick(object sender, EventArgs e) 
    { 
     TimerLabel.Visibility = TimerLabel.Visibility.Equals(Visibility.Hidden) ? Visibility.Visible : Visibility.Hidden; 
     Console.Beep(); 
    } 

    /// <summary> 
    /// Extract time and update label 
    /// </summary> 
    private static void ExtractAndUpdate() 
    { 
     var elapsed = Countdown ? ConvertToTimeSpan() : StopWatch.Elapsed; 
     UpdateTimeLabel(elapsed); 
    } 

    /// <summary> 
    /// Convert int to TimeSpan 
    /// </summary> 
    /// <returns></returns> 
    internal static TimeSpan ConvertToTimeSpan() 
    { 
     var hours = Time/3600; 
     var minutes = (Time % 3600)/60; 
     var seconds = Time % 60; 
     return new TimeSpan(hours, minutes, seconds); 
    } 

    /// <summary> 
    /// Update label with data and change color 
    /// </summary> 
    /// <param name="elapsed"></param> 
    protected static void UpdateTimeLabel(TimeSpan elapsed) 
    { 
     TimerLabel.Foreground = Brushes.Black; 
     var time = String.Format(CultureInfo.CurrentCulture, "{0:00h} {1:00m} {2:00s}", elapsed.Hours, elapsed.Minutes, elapsed.Seconds); 
     if (Countdown && elapsed.TotalMinutes < 1) 
      TimerLabel.Foreground = Brushes.Red; 
     TimerLabel.Content = time; 
    } 
} 
+0

并不清楚如何使用它! – inside 2013-07-28 17:25:37