2016-06-20 2 views
2

Так что у меня это немного кода здесь ...Форма Изменение Перед Другие команды выполняются

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; 

     } 
    } 

Это в основном очень примитивный экран Логин!

Все работает, за исключением того факта, что форма изменяется на форму2 перед тем, как текст label2 можно увидеть. Я попытался исправить это, добавив систему wait comand, но вместо этого это произойдет до того, как текст будет отображаться. Я снова возвращаюсь туда, где начал.

Любая помощь будет оценена!

ответ

4

Никогда не используйте Thread.Sleep для целей ожидания в WinForms.
Он блокирует поток 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; 
    } 
} 
0

Вы не должны звонить Thread.Sleep из потока пользовательского интерфейса в winforms.

Обработчик события клика должен выполнять свою работу и быстро возвращаться, поскольку все чертежи формы, ответы на события изменения размера, ответы на ввод пользователя и т. Д. Происходят в одном потоке. Именно по этой причине вы не видите, как перерисовывается форма - у нее нет шанса, потому что вы приостановили поток, который он использовал бы для этого.

Вам нужно сделать это более «управляемым событиями» способом. Например, вы можете добавить элемент управления Timer в форму с тайм-аутом 1000 мс и обработчик Elapsed, который отображает/скрывает формы.

Затем ваш обработчик кнопки устанавливает таймер Enabled в true и выходит.

Не забудьте остановить таймер в обработчике событий таймера!

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

+0

ответ Yeldar Курмангалиев, вероятно, является лучшим, хотя мой ответ может понадобиться, если у вас нет C# 5.0. –

Смежные вопросы