You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForm时间计数器切换正反方向时如何从当前值继续运行

问题根因

原代码维护了两套独立的计数变量:_elapsedSeconds用于正计时、ts用于倒计时,切换CountUp属性时两套变量没有同步,导致每次切换都会读取对应变量的初始值。

修改方案

统一使用单个TimeSpan变量存储当前计时值,切换计时方向时直接基于该值做增减运算即可,无需维护两套独立计数逻辑。

完整修改后代码

TimeCounter控件代码

using System;
using System.Windows.Forms;

namespace Extract
{
    public partial class TimeCounter : Label
    {
        public bool CountUp { get; set; }

        private Timer _timer;
        // 全局唯一存储当前计时值
        private TimeSpan _currentTime;

        public TimeCounter()
        {
            InitializeComponent();
            // 初始默认计时起始值为100秒,可按需调整
            _currentTime = TimeSpan.FromSeconds(100);
            StartCountTimer();
        }

        public void StartCountTimer()
        {
            _timer = new Timer
            {
                Interval = 1000,
                Enabled = true
            };
            _timer.Tick += (sender, args) =>
            {
                if (CountUp)
                {
                    _currentTime = _currentTime.Add(TimeSpan.FromSeconds(1));
                }
                else
                {
                    // 如需避免倒计时减为负数,可增加判断:if(_currentTime.TotalSeconds > 0) 再执行减法
                    _currentTime = _currentTime.Subtract(TimeSpan.FromSeconds(1));
                }
                // 统一时间格式化规则
                this.Text = _currentTime.ToString(@"hh\:mm\:ss");
            };
        }

        private void TimeCounter_Load(object sender, EventArgs e)
        {

        }
    }
}

Form端代码无需修改

原有的checkBox1_CheckedChanged逻辑可以直接复用,不需要调整。

可选优化
  • 可以新增公开属性暴露_currentTime,支持外部手动设置计时起始值
  • 可以增加计时到0自动停止逻辑,避免出现负时间
  • 可以新增Stop()、Reset()方法满足更多使用需求

内容的提问来源于stack exchange,提问作者Daniel Lip

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 23:45:06