在计时器倒数中包括小时

时间:2018-10-26 16:53:47

标签: c# wpf timespan dispatchertimer

我正在尝试创建一个包含小时数的倒计时。

private int time = 3660;        

public MainWindow()
{
    var vm = new TimerViewModel();

    InitializeComponent();

    // get display setting - 2 means extended
    int displayType = Screen.AllScreens.Length;

    // set the windows datacontext
    DataContext = vm;

    // set up the timedispatcher
    dt.Interval = new TimeSpan(0, 0, 1);
    dt.Tick += Timer_Tick;
}   

private void Timer_Tick(object sender, EventArgs e)
{
    switch(time)
    {
        case int x when x > 10 && x <= 20:                 
            TimerPreview.Foreground = Brushes.Orange;

            time--;
            break;

        .....................

        default:
            TimerPreview.Foreground = Brushes.LimeGreen;
            time--;
            break;
    }

    TimerPreview.Content = string.Format("00:{0:00}:{1:00}",  time / 60, time % 60);
}

我无法弄清楚如何使倒数计时正常工作数小时。只需数分钟和数秒,它就可以很好地工作。

TimerPreview.Content = string.Format("{0:00}:{1:00}:{2:00}", time ???, time ??? 60, time % 60);

我尝试了多种组合,但没有找到解决方案。我想念什么?非常感谢。

2 个答案:

答案 0 :(得分:2)

使用3600(每小时的秒数),并在分钟数上使用模数运算符,就像在秒数上一样(因为您希望60分钟显示为新的小时):

TimerPreview.Content =
    string.Format("{0:00}:{1:00}:{2:00}", time / 3600, (time / 60) % 60, time % 60);

//  320 -> 00:05:20
// 7199 -> 01:59:59
// 7201 -> 02:00:01

答案 1 :(得分:1)

另一个(可能更具可读性)选项是使用TimeSpan处理格式:

TimerPreview.Content = TimeSpan.FromSeconds(time).ToString(@"hh\:mm\:ss");

time3660时的结果:

  

01:01:00


编辑:感谢@GrantWinney指出TimeSpan的默认字符串格式与上述相同,除非时间跨度大于一天,在这种情况下,还包括天数。所以你可以做:

TimerPreview.Content = TimeSpan.FromSeconds(time).ToString();