Текст метки не меняется в C /CLR Windows Forms

#c #visual-studio #winforms #visual-c #clr

Вопрос:

Я работаю над небольшим проектом Windows Forms на C /CLR в сообществе Visual Studios 2019 с использованием .NET Framework 4.0, в котором у меня есть поле со списком и метка.

Приведенный ниже фрагмент кода работает нормально:

 private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {  label1-gt;Text = "comboBox1-gt;Text";  }  

Но если я добавлю Sleep(1000); «после label1-gt;Text = "comboBox1-gt;Text"; «, я ожидаю, что метка изменится до периода сна, но она изменится после окончания периода сна.

В общем, label1-gt;Text = "comboBox1-gt;Text"; выполняется после того, что находится ниже этой строки.

Для приведенного ниже фрагмента кода я хочу, чтобы программа перешла в спящий режим после изменения текста label1.

 private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {  label1-gt;Text = "comboBox1-gt;Text";  Sleep(1000);  }  

Комментарии:

1. То есть по замыслу этикетка не перекрашивается до тех пор, пока ОС не скажет ей об этом. Это не может произойти, пока поток пользовательского интерфейса спит. label1-gt;Обновить() до того, как сон ускорит это. Никогда не отключайте поток пользовательского интерфейса, всегда предпочитайте таймер.

Ответ №1:

Я понимаю, что ты имеешь в виду. Для реализации этой функции вам необходимо использовать a timer . Вам нужно добавить a timer в свою форму WinForm, а затем установить значение интервала равным 1000 в свойстве timer. Вам нужно использовать Start для запуска таймера, вы можете обратиться к моему коду.

this-gt;timer1-gt;Interval = 1000;

this-gt;timer1-gt;Tick = gcnew System::EventHandler(this, amp;MyForm::timer1_Tick);

timer1-gt;Start();

private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { label1-gt;Text = comboBox1-gt;Text; }