我试图在实时16秒后停止计时器,但我不知道我该怎么做。
我做了这个小例子:当picturebox1与picturebox2相交时,这个动作激活一个计时器,这个计时器必须在16秒内实时显示picturebox3并在停止后(计时器)(并且图片框3没有' t show)。
(抱歉我的英文。但是西班牙语的StackOverflow没有很多信息)。
我使用的是Windows窗体和C#
private void timer2_Tick(object sender, EventArgs e)
{
pictureBox7.Hide();
if ((pictureBox3.Bounds.IntersectsWith(pictureBox2.Bounds) && pictureBox2.Visible) || (pictureBox5.Bounds.IntersectsWith(pictureBox2.Bounds) && pictureBox2.Visible))
{
puntaje++;
this.Text = "Puntaje: " + puntaje;
if (puntaje % 5 == 0)
{
timer3.Enabled=true;
//This is the part where i want set down the timer3, timer 2 is on
}
}
答案 0 :(得分:1)
您可以在计时器刻度事件处理程序上尝试此操作。 Timespan计算两个日期之间的经过时间。在这种情况下,自16秒以来,我们将其计为负数。
private void timer1_Tick(object sender, EventArgs e)
{
TimeSpan ts = dtStart.Subtract(DateTime.Now);
if (ts.TotalSeconds <= -16)
{
timer1.Stop();
}
}
确保在启动计时器时声明您的dtStart(DateTime):
timer1.Start();
dtStart = DateTime.Now;
答案 1 :(得分:0)
我能看到这种方法的最简洁方法是使用System.Timers.Timer
的区间参数。
这是代码的示例代码段
var timer = new Timer(TimeSpan.FromSeconds(16).TotalMilliseconds) { AutoReset = false };
timer.Elapsed += (sender, e) =>
{
Console.WriteLine($"Finished at exactly {timer.Interval} milliseconds");
};
_timer.Start();
TimeSpan.FromSeconds(16).TotalMilliseconds
基本上转换为16000,但我使用TimeSpan静态方法让您更容易理解它,看起来更具可读性。
计时器的AutoReset属性告诉它只应触发一次。
根据您的代码调整
private void timer2_Tick(object sender, EventArgs e)
{
pictureBox7.Hide();
if ((pictureBox3.Bounds.IntersectsWith(pictureBox2.Bounds) && pictureBox2.Visible)
|| (pictureBox5.Bounds.IntersectsWith(pictureBox2.Bounds) && pictureBox2.Visible))
{
puntaje++;
this.Text = "Puntaje: " + puntaje;
if (puntaje % 5 == 0)
{
var timer3 = new Timer(TimeSpan.FromSeconds(16).TotalMilliseconds) { AutoReset = false };
timer3.Elapsed += (sender, e) =>
{
pictureBox3.Visible = true;
};
timer3.Start();
}
}
}
如果这解决了您的问题,请标记已回答的问题。