计时器滴答错误的值

时间:2014-03-10 23:18:49

标签: c# timer

我正在使用Windows Phone 8 SDK开发游戏 我需要一个倒数计时器。

我第一次实现了Dispatcher计时器 CLICK 计时器减少没有错误!

但是如果我按重置(它应该重置为 60 SECONDS 并开始倒计时) 它重置为60 BUT 它每秒减少“ 2秒”!

如果再按一次重置,则每秒减少 3秒

  

我写的示例代码与我的应用程序的想法相同:(同样错误   结果)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using PhoneApp3.Resources;
using System.Windows.Threading;

namespace PhoneApp3
{
    public partial class MainPage : PhoneApplicationPage
    {
        private DispatcherTimer time = new DispatcherTimer(); // DISPATCHER TIMER
        private int left;

        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        //Starting Countdown
        private void Start_Click_1(object sender, RoutedEventArgs e)
        {
            left = 60; // time left
            time.Interval = TimeSpan.FromSeconds(1);
            time.Tick += time_Tick;
            time.Start();
        }

        void time_Tick(object sender, EventArgs e)
        {
            left--; // decrease 
            txt.Text = Convert.ToString(left);  // update text           
        }

        private void reset_Click(object sender, RoutedEventArgs e)
        {
            time.Stop(); 
            Start_Click_1(null, null); // RE - START 
        }


    }
}

2 个答案:

答案 0 :(得分:4)

每当您按下重置并再次运行Start_Click_1时,您就会再次订阅time_Tick

time.Tick += time_Tick;

因此,在按下Reset 3次后,您订阅了3次,每次tick事件触发时,以下代码行运行3次:

left--;

将订阅移至构造函数:

public MainPage()
{
    InitializeComponent();

    time.Tick += time_Tick;
}

//Starting Countdown
private void Start_Click_1(object sender, RoutedEventArgs e)
{
    left = 60; // time left
    time.Interval = TimeSpan.FromSeconds(1);
    time.Start();
}

答案 1 :(得分:1)

正如汉斯在评论中所说,每次点击按钮时,你都错误地添加了事件处理程序。

您应该调用此代码

time.Interval = TimeSpan.FromSeconds(1);
time.Tick += time_Tick;

在构造函数中,而不是事件处理程序。