在WPF窗口中显示一个运行计时器

本文关键字:一个 运行 计时器 WPF 窗口 显示 | 更新日期: 2023-09-27 18:14:23

我需要在窗口上显示一个运行计时器以及测试的信息,如ID,测试名称,状态,开始时间,结束时间等

我真希望我能在页面上有一个定时器控件,告诉用户测试已经运行了多长时间。


如何在页面上添加一个运行计时器?

另外,如果可能的话,我希望我的计时器可以从某个特定的时间开始,而不是从00:00:00开始。我需要这样做的原因是,当测试运行了一段时间后,用户可以打开这个页面,计时器上显示的运行时间应该是(current_time - start_time),并从这里开始。

如果测试开始于:7:00 AM,用户在7:05AM打开页面,测试仍在运行,则计时器应从00:05:00开始

在WPF窗口中显示一个运行计时器

这是我拼凑的一个非常基本的例子。

using System.Windows.Threading;
namespace BasicTimer
{
    public partial class MainWindow : Window
    {
        DispatcherTimer t;
        DateTime start;
        public MainWindow()
        {
            InitializeComponent();
            t = new DispatcherTimer(new TimeSpan(0, 0, 0, 0, 50), DispatcherPriority.Background,
                t_Tick, Dispatcher.CurrentDispatcher); t.IsEnabled = true;
            start = DateTime.Now;
        }
        private void t_Tick(object sender, EventArgs e)
        {
            TimerDisplay.Text = Convert.ToString(DateTime.Now - start);
        }

主窗口XAML

<Window x:Class="BasicTimer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="100" Width="200">
    <Grid>
        <TextBlock x:Name="TimerDisplay" HorizontalAlignment="Left"/>
    </Grid>
</Window>

我是这样做到的。

Stopwatch watch = new Stopwatch();
private void StartTimer()
{
    new Thread(() =>
    {
        watch.Restart();
        while (watch.IsRunning)
        {
            Dispatcher.Invoke(() =>
            {
                timeText.Text = Math.Round(watch.Elapsed.TotalSeconds, 2).ToString() + "s";
            });
        }
    }).Start();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
    //i had to start and stop the timer inside a thread, i was having issues without doing so
    new Thread(() =>
    {
        StartTimer();
        //I was calling an api here
        Dispatcher.Invoke(() =>
        {
            messageText.Text = response.message;
        });
        watch.Stop();
    }).Start();            
}