在WPF窗口中显示一个运行计时器
本文关键字:一个 运行 计时器 WPF 窗口 显示 | 更新日期: 2023-09-27 18:14:23
我需要在窗口上显示一个运行计时器以及测试的信息,如ID,测试名称,状态,开始时间,结束时间等
我真希望我能在页面上有一个定时器控件,告诉用户测试已经运行了多长时间。
如何在页面上添加一个运行计时器?
另外,如果可能的话,我希望我的计时器可以从某个特定的时间开始,而不是从00:00:00开始。我需要这样做的原因是,当测试运行了一段时间后,用户可以打开这个页面,计时器上显示的运行时间应该是(current_time - start_time),并从这里开始。
如果测试开始于:7:00 AM,用户在7:05AM打开页面,测试仍在运行,则计时器应从00:05:00开始
这是我拼凑的一个非常基本的例子。
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();
}