计时器刻度错误的值
Posted
技术标签:
【中文标题】计时器刻度错误的值【英文标题】:Timer ticks with wrong values 【发布时间】:2014-03-10 23:18:48 【问题描述】:我正在使用 Windows Phone 8 SDK 开发游戏 我需要一个倒计时。
我在第一次 CLICK 时实现了 Dispatcher 计时器 计时器减少,没有错误!
但如果我按下 RESET(它应该重置为 60 SECONDS 并开始倒计时) 它重置为 60 但它每秒减少“2 秒”!
如果我再按一次 RESET ,它会每秒减少 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
【问题讨论】:
不要不断添加另一个 Tick 事件处理程序。将 time.Tick 赋值放在构造函数中。 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。 @HansPassant 我不明白,你的意思是只有构造函数中的 Tick 赋值,其余的都可以吗? 【参考方案1】:每次你按下重置,Start_Click_1
再次运行,你就再次订阅time_Tick
:
time.Tick += time_Tick;
所以在按了 3 次 Reset 后,你订阅了 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();
【讨论】:
【参考方案2】:正如 Hans 在 cmets 中所说,每次单击按钮时您都错误地添加了事件处理程序。
你应该调用这个代码
time.Interval = TimeSpan.FromSeconds(1);
time.Tick += time_Tick;
在构造函数中,而不是在事件处理程序中。
【讨论】:
或者,更准确地说:这会导致执行第一个滴答 1x,第二个滴答 2x,第三个滴答 3x,因为每个滴答都会向事件添加另一个处理程序。以上是关于计时器刻度错误的值的主要内容,如果未能解决你的问题,请参考以下文章