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,可能需要我的答案。