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
相关产品推荐
相关产品推荐

