【问题标题】:How to countdown in seconds from minutes using a countdown timer如何使用倒数计时器从分钟倒数秒
【发布时间】:2015-04-10 20:38:33
【问题描述】:

目前正在开发一个简单的 windows phone 8.1 silverlight 应用程序,并实现了倒计时时间。我让它在我可以输入设定的分钟数的地方工作,它倒计时很好,但我想要发生的是用户输入分钟数并从那里以秒为单位倒计时,例如它目前是 10、9 , 8, 7, 6, 5 输入 10 秒时。

我想要发生的是用户输入 5 并且它像这样倒计时: 4:59 4:58 4:57

这是我当前的代码:

    timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    timer.Tick += timer_Tick;
    basetime = Convert.ToInt32(tbxTime.Text);;
    tbxTime.Text = basetime.ToString();
    timer.Start();
}


void timer_Tick(object sender, object e)
{
    basetime = basetime - 1;
    tbxTime.Text = basetime.ToString();
    if (basetime == 0)
    {
        timer.Stop();
    }

【问题讨论】:

    标签: c# windows timer windows-phone-8.1


    【解决方案1】:

    如果您将basetime 改为TimeSpan 而不是int,则可以保留大部分现有代码。通过适当的静态方法很容易从 Minutes 或 Seconds 设置它的值。

    var basetime = TimeSpan.FromMinutes(5);
    

    然后你可以像这样从中减去一秒:

    basetime -= TimeSpan.FromSeconds(1);
    

    并像这样显示它:

    tbxTime.Text = basetime.ToString(@"m\:ss");
    

    最后,将其与零进行比较也很简单:

    if (basetime <= TimeSpan.Zero)
    

    有关更多显示选项,请参阅Custom TimeSpan Format Strings

    【讨论】:

    • 看起来你的速度快了 92 个 OP 计时器的滴答声。你有我的投票。
    • 这是迄今为止效果最好的,实施时没有中断。我在 tbxTime 文本框中输入了 5,它只倒计时到 4:59 然后就停止了,我错过了什么吗?
    • @user4682589 很难说你是否遗漏了什么。尝试调试您的代码并找出问题所在。
    • 好的,谢谢你的时间,我会玩一下升技并发布结果,再次感谢
    【解决方案2】:

    我认为您可以使用 TimeSpan 类的适当格式(您肯定会find many examples on SO)。简单的例子看起来像这样(我假设你有一个 TextBox 输入时间和 TextBlock 显示计数器);

    DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(1) };
    TimeSpan time;
    public MainPage()
    {
        this.InitializeComponent();
        timer.Tick += (sender, e) =>
            {
                time -= TimeSpan.FromSeconds(1);
                if (time <= TimeSpan.Zero) timer.Stop();
                myTextBlock.Text = time.ToString(@"mm\:ss");
            };
    }
    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    { time = TimeSpan.FromMinutes(int.Parse((sender as TextBox).Text)); }
    
    private void startBtn_Click(object sender, RoutedEventArgs e)
    { timer.Start(); }
    

    请注意,这是一个非常简单的示例。您还应该考虑 DispatcherTimer 是否是一个好主意 - 它适用于调度程序,因此如果您在主 UI 线程上运行一些大工作,它可能无法正确计算时间。在这种情况下,您可能会考虑使用不同的计时器,例如 System.Threading.Timer,它在单独的线程上运行,因此您必须通过 Dispatcher 更新您的 UI。

    【讨论】:

    • 关于DispatchTimer的重要信息。
    • @CoderDennis 这就是我留下这个答案的原因 - 它提供了一些可能对某人有帮助的额外信息,没有这个我会删除我的答案,因为不需要重复答案:]跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多