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

4
我需要在窗口上显示一个运行中的计时器,同时提供测试信息,如ID、测试名称、状态、开始时间、结束时间等。
我希望页面上有一个计时器控件,告诉用户测试运行了多长时间。
如何在页面上添加一个运行中的计时器?
此外,如果可能的话,我希望我的计时器可以从特定时间开始而不是从00:00:00开始。这是因为用户可以在测试运行一段时间后打开此页面,计时器显示的经过时间应该是(当前时间-开始时间),并从这里开始。
如果测试开始于上午7:00,用户在上午7:05打开页面,测试仍在运行,则计时器应该从00:05:00开始。

提供需求却没有展示任何努力曾经被认为是离题的。现在仍然存在争议,许多人认为这是不礼貌的行为。 - Scott Solmer
我仍然会给你一些提示,你正在寻找一个DispatcherTimer - Scott Solmer
谢谢,Okuma。我尝试在我的应用程序中使用DispatcherTimer,但我不知道如何在页面上显示它。我不知道可以使用哪个工具来显示DispatcherTimer。 - KField
计时器本身不是一个控件,它不会被显示。你需要在tick事件中做一些操作来更新一些UI元素,不管是标签、文本块、进度栏还是其他什么。 - Scott Solmer
2个回答

13

这是我随意编写的一个非常基础的例子。

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);
        }

MainWindow 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>

事件处理程序必须是静态的,这会防止访问您的 TimerDisplay。您必须使用不同的构造函数,然后订阅 DispatcherTimer.Tick - Isaac Baker

0

这是我如何实现的。

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();            
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接