【发布时间】:2021-10-09 08:09:24
【问题描述】:
我正在尝试创建一个倒计时,其中显示文本“GAME STARTS IN:”,并使用 for 循环和 Thread.Sleep 变量从三个倒计时。我首先使用设计器创建“游戏开始于:”部分,但在变量不显示后,我将其移至代码中。现在什么都没有出现。这就是我现在的计时器方法中的内容:
如果 (!countedDown)
倒计时();
Countdown.Hide();
然后在 DoCountdown 方法中:
this.Countdown.BackColor = System.Drawing.Color.Transparent;
this.Countdown.ForeColor = System.Drawing.Color.White;
this.Countdown.Location = new System.Drawing.Point(360, 17);
this.Countdown.Name = "Countdown";
this.Countdown.Font = new System.Drawing.Font("Segoe UI", 12F,
System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point);
this.Countdown.Size = new System.Drawing.Size(185, 24);
this.Countdown.TabIndex = 6;
countedDown = true;
for (int i = 3; i > 0; i--)
{
Countdown.Text = "GAME STARTS IN: " + i;
System.Threading.Thread.Sleep(1000);
}
我在 System.Threading.Thread.Sleep(100) 处设置了一个断点,一切看起来都很正常。 Countdown.Text 等于“GAME STARTS IN: 3”。尝试集成解决方案后,文本未显示。这是我的代码中的更多上下文:
这是我的开始屏幕表单
private void QuitGame(object sender, EventArgs e)
{
Application.Exit();
}
private void StartMultiplayerGame(object sender, EventArgs e)
{
GameScreen startGame = new GameScreen();
startGame.Show();
Hide();
}
【问题讨论】:
-
Countdown.Text = "GAME STARTS IN: " + i;在for循环完成之前不会更新。 -
您可以在循环中添加一个 Countdown.Refresh()...但是像这样锁定主线程是不好的做法...尝试使用带有事件的 Timer。
-
我建议启动
Timer,它每 1000 毫秒触发一次,并简单地保持全局计数...当它达到 3 时,停止计时器并继续。 -
我会试试这个,但我可能会遇到一些麻烦,对 c# 和 winForms 不是很熟悉。
-
或许可以考虑微软的响应式框架,你可以这样做:
Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1.0)).Take(3).ObserveOn(this).Subscribe(x => Countdown.Text = $"GAME STARTS IN: {3 - x}", () => Countdown.Text = $"Started");
标签: c# string winforms variables textlabel