如何在WPF的TextBlock中实现倒计时功能及CS0120错误解决
问题解决方案
错误原因分析
- 错误CS0120是因为你直接使用了TextBlock类名访问
Text属性,而不是使用你在XAML中定义的控件实例名。你给TextBlock设置的x:Name="countDown",所以应该用实例名countDown访问属性,而不是类名TextBlock。 - 额外的命名冲突:你定义的字符串变量名
countDown和TextBlock控件的名称countDown重名,容易出现歧义,建议修改字符串变量名避免冲突。 - 额外的逻辑问题:
DateTime是不可变类型,daysLeft.AddSeconds(-1)不会修改原daysLeft的值,会返回一个新的DateTime对象,而且你把daysLeft声明为readonly,也不允许在构造函数外修改。实际上你不需要手动修改目标时间,每次Tick直接用目标时间减去当前时间计算剩余时间即可,手动减秒反而会因为定时器精度问题出现误差。 - 原判断条件
t.Seconds >= 0存在逻辑漏洞:会出现天/时/分还有剩余,但秒数为负的异常情况,应该判断总秒数t.TotalSeconds >= 0。
修正后的完整代码
XAML部分无需修改,保持原有x:Name="countDown"的定义即可,后台代码修改如下:
public partial class justdancetrailer : Window { private readonly DispatcherTimer Timer = new DispatcherTimer(); // 目标时间不需要修改,保留readonly声明即可 private readonly DateTime daysLeft; public justdancetrailer() { InitializeComponent(); daysLeft = DateTime.Parse("1/02/2022 12:00:00 AM"); Timer.Interval = TimeSpan.FromSeconds(1.0); Timer.Tick += Timer_Tick; Timer.Start(); } private void Timer_Tick(object sender, EventArgs e) { TimeSpan t = daysLeft.Subtract(DateTime.Now); // 判断总秒数大于等于0,覆盖所有剩余时间场景 if (t.TotalSeconds >= 0) { // 字符串变量改名避免和控件名冲突 string countDownStr = string.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds until launch.", t.Days, t.Hours, t.Minutes, t.Seconds); // 用XAML中定义的控件实例名访问Text属性 countDown.Text = countDownStr; } else { Timer.Stop(); // 可根据需求补充倒计时结束的提示 // countDown.Text = "已到达目标时间"; } } // 其余原有方法无需修改 private void trailer_play(object sender, RoutedEventArgs e) { trailer.Play(); } private void trailer_stop(object sender, RoutedEventArgs e) { trailer.Stop(); trailer.Close(); } private void trailer_pause(object sender, RoutedEventArgs e) { trailer.Pause(); } private void ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { trailer.Volume = e.NewValue; } }
内容的提问来源于stack exchange,提问作者Alphamage1212
相关产品推荐
相关产品推荐

