C# WPF定时器倒计时

C# WPF定时器倒计时,c#,wpf,timer,countdown,C#,Wpf,Timer,Countdown,我想知道WPF中的计时器 我基本上知道的是如何制作一个简单的倒计时计时器(标签),如下代码: private void buttonStartOne_Click(object sender, RoutedEventArgs e) { counterOne = new DispatcherTimer(); counterOne.Tick += new EventHandler(counterOne_Tick); counterOne.Interval = new TimeS

我想知道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个单独的计数器和标签(每个时间单位一个)来完成吗?
或者有什么更好的方法来解决这个问题呢?

您可以使用该方法将
时间跨度
转换为字符串。在标签上设置结果字符串

您可以使用该方法将
时间跨度
转换为字符串。在标签上设置结果字符串

公共类TimeController
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;
    }
}
{ 私有静态只读TimeSpan TimeSpan=新TimeSpan(0,0,1); 专用静态整数时间; 受保护的静态只读分派器计时器=新分派器(); 受保护的静态只读Dispatchermer蜂鸣器=新Dispatchermer(); 受保护的静态只读秒表秒表=新秒表(); 受保护的静态标签定时器标签; 受保护的静态按钮启动按钮; 内部静态int-Time{get{return}Time;}set{{u-Time=value;ExtractAndUpdate();} 内部静态布尔倒计时{get;set;} /// ///静态构造函数 /// 静态时间控制器() { 蜂鸣器。间隔=时间间隔; BeeperTimer.Tick+=BeeperTick; Timer.Interval=TimeSpan; Timer.Tick+=TimerTick; } /// ///计时器勾选事件方法 /// /// /// 私有静态void TimerTick(对象发送方、事件参数) { 如果(倒计时) 如果(时间>0) { 提取和更新(); 时间-=1; } 其他的 { 停止运行(); BeeperTimer.Start(); } 其他的 提取和更新(); } /// ///启动计时器和秒表 /// 受保护静态空隙起始耳轴() { Timer.Start(); 秒表。开始(); 开始按钮。内容=标签。暂停; } /// ///停车计时器和秒表 /// 受保护的静态void StopRunning() { Timer.Stop(); 秒表; StartButton.Content=Labels.Start; } /// ///蜂鸣器事件方法和标签闪烁 /// /// /// 私有静态void蜂鸣器(对象发送器,事件参数e) { TimerLabel.Visibility=TimerLabel.Visibility.Equals(Visibility.Hidden)?Visibility.Visibility:Visibility.Hidden; Console.Beep(); } /// ///提取时间并更新标签 /// 私有静态void ExtractAndUpdate() { var EXPERSED=倒计时?ConvertToTimeSpan():秒表.EXPERSED; UpdateTimeLabel(已用); } /// ///将int转换为TimeSpan /// /// 内部静态时间跨度ConvertToTimeSpan() { var小时=时间/3600; var分钟=(时间%3600)/60; var秒=时间%60; 返回新的时间跨度(小时、分钟、秒); } /// ///使用数据更新标签并更改颜色 /// /// 受保护的静态void UpdateTimeLabel(时间跨度已过) { TimerLabel.前台=画笔.黑色; var time=String.Format(CultureInfo.CurrentCulture,“{0:00h}{1:00m}{2:00s}”,经过.Hours,经过.Minutes,经过.Seconds); if(倒计时和已用时间。总分钟数<1) TimerLabel.前台=画笔.Red; TimerLabel.Content=时间; } }
公共类时间控制器
{
私有静态只读TimeSpan TimeSpan=新TimeSpan(0,0,1);
专用静态整数时间;
受保护的静态只读分派器计时器=新分派器();
受保护的静态只读Dispatchermer蜂鸣器=新Dispatchermer();
受保护的静态只读秒表秒表=新秒表();
受保护的静态标签定时器标签;
受保护的静态按钮启动按钮;
内部静态int-Time{get{return}Time;}set{{u-Time=value;ExtractAndUpdate();}
内部静态布尔倒计时{get;set;}
/// 
///静态构造函数
/// 
静态时间控制器()
{
蜂鸣器。间隔=时间间隔;
BeeperTimer.Tick+=BeeperTick;
Timer.Interval=TimeSpan;
Timer.Tick+=TimerTick;
}
/// 
///计时器勾选事件方法
/// 
/// 
/// 
私有静态void TimerTick(对象发送方、事件参数)
{
如果(倒计时)
如果(时间>0)
{
提取和更新();
时间-=1;
}
其他的
{
停止运行();
BeeperTimer.Start();
}
其他的
提取和更新();
}
/// 
///启动计时器和秒表
/// 
受保护静态空隙起始耳轴()
{
Timer.Start();
秒表。开始();
开始按钮。内容=标签。暂停;
}
/// 
///停车计时器和秒表
/// 
受保护的静态void StopRunning()
{
Timer.Stop();
秒表;
StartButton.Content=Labels.Start;
}
/// 
///蜂鸣器事件方法和标签闪烁
/// 
/// 
/// 
私有静态void蜂鸣器(对象发送器,事件参数e)
{
TimerLabel.Visibility=TimerLabel.Visibility.Equals(Visibility.Hidden)?Visibility.Visibility:Visibility.Hidden;
Console.Beep();
}
/// 
///提取时间并更新标签
/// 
私有静态void ExtractAndUpdate()
{
var EXPERSED=倒计时?ConvertToTimeSpan():秒表.EXPERSED;
UpdateTimeLabel(已用);
}
/// 
///将int转换为TimeSpan
/// 
/// 
内部静态时间跨度ConvertToTimeSpan()
{
var小时=时间/3600;
var分钟=(T