在执行其他命令之前更改表单

时间:2016-06-20 04:05:32

标签: 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");
            label2.ForeColor = System.Drawing.Color.Green;
            System.Threading.Thread.Sleep(1000);
            this.Hide();
            Form2 form2 = new Form2();
            form2.Visible = true;

        }
    }

它基本上是一个非常原始的登录屏幕!

除了在可以看到label2文本之前表单更改为form2这一事实外,一切正常。我尝试通过添加系统等待命令来解决这个问题,但是在文本可以显示之前就会出现这种情况。我又回到了我开始的地方。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

永远不要在WinForms中使用Thread.Sleep进行等待 它会阻止GUI线程,用户不会更新/看到您的标签。

当然,有很多变通方法,你可以阅读它here

最简单的方法是使用C#5.0 async / await功能:

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;
    }
}

答案 1 :(得分:0)

您不应该在winforms中从UI线程调用Thread.Sleep

单击事件处理程序需要完成其工作并快速返回,因为所有表单绘制,响应调整大小事件,响应用户输入等都发生在同一个线程上。这就是你没有看到表单重新绘制的原因 - 它没有机会,因为你暂停了用来做这件事的线程。

你需要在更多"事件驱动的"办法。例如,您可以向表单添加Timer控件,超时为1000毫秒,以及显示/隐藏表单的Elapsed处理程序。

然后你的按钮处理程序只将计时器Enabled设置为true,然后退出。

请记住在计时器的事件处理程序中停止计时器!

答案 2 :(得分:0)

试试这个:

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的机会