WPF实现判断某个状态持续的时间,当为某状态时开始计时

该代码段展示了如何在WPF应用中创建一个名为`MainWindow`的窗口,包含两个计时器功能。通过`DispatcherTimer`控制时间显示,用户界面有两部分用于显示时间,分别由`txtTime`和`txtTime2`控制。当满足特定条件(如随机数匹配)时,计时器开始或停止,同时更新对应的时间显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 新建项目名为 记录时长
  2. MainWindow.xmal代码:
<Window x:Class="记录时长.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:记录时长"
        mc:Ignorable="d"
        Title="MainWindow" Height="320.93" Width="1115.278">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <StackPanel Orientation="Horizontal" Margin="10"/>

        <StackPanel Orientation="Horizontal" Grid.Row="1" Margin="10">
            <Label Content="Time:"/>
            <TextBox Name="txtTime" Width="100" Margin="5" IsEnabled="False"/>
            <TextBox x:Name="txtTime2" Width="100" Margin="5" IsEnabled="False"/>
        </StackPanel>
    </Grid>
</Window>

  1. MainWindow.xmal.cs代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;
using 记录时长;

namespace 记录时长
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        private bool desiredState = false;
        private bool timing = false;
        public DateTime startTime;
        public TimeSpan elapsedTime = TimeSpan.Zero;
        private bool timing2 = false;
        private DateTime startTime2;
        private TimeSpan elapsedTime2 = TimeSpan.Zero;

        private DispatcherTimer statusCheckTimer;
        private Timer timingTimer;
        private Timer timingTimer2;

        public MainWindow()
        {
            InitializeComponent();

            // 初始化计时器
            timingTimer = new Timer();
            timingTimer.Elapsed += TimingTimer_Elapsed;
            timingTimer.Interval = 1000;

            timingTimer2 = new Timer();
            timingTimer2.Elapsed += TimingTimer_Elapsed2;
            timingTimer2.Interval = 1000;
            // 初始化状态检查定时器
            statusCheckTimer = new DispatcherTimer();
            statusCheckTimer.Tick += StatusCheckTimer_Tick;
            statusCheckTimer.Interval = TimeSpan.FromSeconds(1);
            statusCheckTimer.Start();

        }

        private void StatusCheckTimer_Tick(object sender, EventArgs e)
        {
            // 实时检查状态
            //bool newState = true;//获取状态
            //if (newState != desiredState)
            //{
            //    desiredState = newState;
            Random random = new Random();  //写随机值测试
            var value = random.Next(1, 10);

                if (value==1||value==2)  //判断状态
                {
                    if (!timing)
                    {
                        timing = true;
                        startTime = DateTime.Now;
                        txtTime.IsEnabled = true;
                        timingTimer.Start();
                    }
                }
                else
                {
                    if (timing)
                    {
                        timing = false;
                        elapsedTime += DateTime.Now - startTime;
                        txtTime.IsEnabled = false;
                        timingTimer.Stop();
                    }
                }

            if (value == 6 || value == 7)
            {
                if (!timing2)
                {
                    timing2 = true;
                    startTime2 = DateTime.Now;
                    txtTime2.IsEnabled = true;
                    timingTimer2.Start();
                }
            }
            else
            {
                if (timing2)
                {
                    timing2 = false;
                    elapsedTime2 += DateTime.Now - startTime2;
                    txtTime2.IsEnabled = false;
                    timingTimer2.Stop();
                }
            }
            // }
        }
        

        private void TimingTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            // 更新时间显示
            Dispatcher.Invoke(() => {
                txtTime.Text = (elapsedTime + (DateTime.Now - startTime)).ToString(@"hh\:mm\:ss");
            });
        }
        private void TimingTimer_Elapsed2(object sender, ElapsedEventArgs e)
        {
            // 更新时间显示
            Dispatcher.Invoke(() => {
                txtTime2.Text = (elapsedTime2 + (DateTime.Now - startTime2)).ToString(@"hh\:mm\:ss");
            });
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值