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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:45:05