C# 在执行其他命令之前更改表单
我这里有一些代码C# 在执行其他命令之前更改表单,c#,winforms,C#,Winforms,我这里有一些代码 private void button1_Click(object sender, EventArgs e) { if (textBox2.Text==("Tim The Enchanter") && textBox1.Text==("cave100")) { label2.Visible = true; label2.Text = ("Correct");
private void button1_Click(object sender, EventArgs e)
{
if (textBox2.Text==("Tim The Enchanter") && textBox1.Text==("cave100"))
{
label2.Visible = true;
label2.Text = ("Correct");
label2.ForeColor = System.Drawing.Color.Green;
System.Threading.Thread.Sleep(1000);
this.Hide();
Form2 form2 = new Form2();
form2.Visible = true;
}
}
它基本上是一个非常原始的登录屏幕
除了表单在label2文本可见之前更改为form2这一事实之外,其他一切都正常工作。我试图通过添加一个系统等待命令来解决这个问题,但这在文本显示之前就完成了。我又一次回到了起点
任何帮助都将不胜感激 您不应该在winforms中从UI线程调用
Thread.Sleep
单击事件处理程序需要完成其工作并快速返回,因为所有表单绘制、响应调整大小事件、响应用户输入等都发生在同一线程上。这就是为什么你看不到表单自己重新绘制的原因——它没有机会,因为你挂起了它用来重新绘制的线程
您需要以一种更“事件驱动”的方式来实现这一点。例如,您可以向表单中添加一个超时为1000ms的计时器
控件和一个显示/隐藏表单的已用
处理程序
然后,您的按钮处理程序只需将计时器Enabled
设置为true
,然后退出
不过,请记住在计时器的事件处理程序中停止计时器 试试这个:
private void button1_Click(object sender, EventArgs e)
{
if (textBox2.Text==("Tim The Enchanter") && textBox1.Text==("cave100"))
{
label2.Visible = true;
label2.Text = ("Correct");
label2.ForeColor = System.Drawing.Color.Green;
new Timer{Enabled=true,Interval=100}.Tick += (s,e) =>
{
((Timer)s).Dispose();
this.Hide();
Form2 form2 = new Form2();
form2.Visible = true;
}
}
}
它将使操作系统有机会在显示
Form2
的实例之前对UI进行修改。切勿在WinForms中使用Thread.Sleep
进行等待。它会阻止GUI线程,并且用户不会更新/看到您的标签 当然,有很多解决方法,你可以阅读 最简单的方法是使用C#5.0
异步
/等待
功能:
private async void button1_Click(object sender, EventArgs e)
{
if (textBox2.Text==("Tim The Enchanter") && textBox1.Text==("cave100"))
{
label2.Visible = true;
label2.Text = ("Correct");
label2.ForeColor = System.Drawing.Color.Green;
await Task.Delay(1000);
this.Hide();
Form2 form2 = new Form2();
form2.Visible = true;
}
}
Yeldar Kurmangaliyev的答案可能是最好的,尽管如果你没有C#5.0,可能需要我的答案。