所以我刚开始学习C#并使用表格。我已经能够创建一个数字时钟并修补这个和那个,但现在我正在尝试为一个derpy游戏制作一个基本的UI,我的计时器不起作用。
首先 - 我想要完成的事情:一个简单的递减计时器,从60秒开始(*时钟样式(mm:ss))。
第二,这就是我所拥有的:
public partial class Form1 : Form
{
private int counter = 60;
public Form1()
{
InitializeComponent();
label1.Text = TimeSpan.FromMinutes(1).ToString("m\\:ss");
}
private void pictureBox2_Click(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
counter--;
if (counter == 0)
{
timer1.Stop();
label1.Text = counter.ToString();
MessageBox.Show("Time's Up!!");
}
}
private void label1_Click(object sender, EventArgs e)
{
var startTime = DateTime.Now;
var counter = (TimeSpan.FromMinutes(1)).ToString("m\\:ss");
timer1 = new Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 1000;
timer1.Start();
label1.Text = counter.ToString();
}
}
欣赏反馈和知识!
答案 0 :(得分:1)
这对我来说很好。我会给进度更新,因为时间倒计时表明它正在运行。例如,如果您在标签中执行此操作,则可以执行以下操作:
private void timer1_Tick(object sender, EventArgs e)
{
counter--;
label1.Text = counter.ToString();
if (counter == 0)
{
timer1.Stop();
MessageBox.Show("Time's Up!!");
}
}
请注意label1.Text = counter.ToString();
行已在counter == 0
检查之前移动,以便能够为所有计数器值提供反馈。
同样,如果您没有跟踪使用timer1
生成的实例数,可能会意外启动多个new Timer()
个实例。有多种方法可以执行此操作,但您可以在创建新实例之前检查timer1
是否已存在以及counter == 0
。您可以将此检查作为保护条款执行(即。return
如果其中任何一个条件匹配)。
private void label1_Click(object sender, EventArgs e)
{
var startTime = DateTime.Now;
if (timer1 == null || (timer1 != null && counter == 0)) return;
counter = (TimeSpan.FromMinutes(1)).ToString("m\\:ss");
timer1 = new Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 1000;
timer1.Start();
label1.Text = counter.ToString();
}
如果你想让这个倒计时自动启动,你可以把它直接放到构造函数中,或者把它放到另一个方法中并从构造函数中调用它,如下所示:
public Form1()
{
InitializeComponent();
StartCountdown();
}
private void StartCountdown()
{
var startTime = DateTime.Now;
/* the rest of your original label1_Click code goes here ... */
}
答案 1 :(得分:1)
从我看到的代码中,你的计时器正在运行,但你没有在每次计数中更新它,你在计时器结束时更新 -
private void timer1_Tick(object sender, EventArgs e)
{
counter--;
if (counter == 0)
{
timer1.Stop();
label1.Text = counter.ToString(); // *** Look here
MessageBox.Show("Time's Up!!");
}
}
您应该在每个刻度中更新计时器,因此请从if
块中取出更新标签代码 -
private void timer1_Tick(object sender, EventArgs e)
{
counter--;
label1.Text = counter.ToString(); // should work
if (counter == 0)
{
timer1.Stop();
MessageBox.Show("Time's Up!!");
}
}
并在每个周期中重置计数器 -
private void label1_Click(object sender, EventArgs e)
{
var startTime = DateTime.Now;
var counter = (TimeSpan.FromMinutes(1)).ToString("m\\:ss");
timer1 = new Timer();
timer1.Tick += new EventHandler(timer1_Tick);
timer1.Interval = 1000;
timer1.Start();
label1.Text = counter.ToString();
this.counter = 60
}
注意:我真的不确定此代码是否会引发任何访问 由于在不同线程中更新UI而导致的违规错误。 如果是这样,那么您必须使用
async
/await
或事件/代表 更新用户界面。请告诉我,如果这会引发错误,那么我会给你
async/await
版本。