我有4个标签,每个等待500毫秒后必须更改为粗体。
我试过使用这个功能:
LabelUpdater(lblIF); //to bold
Thread.Sleep(500);
LabelUpdater(lblIF); //to regular again
LabelUpdater(lblID); //to bold
Thread.Sleep(500);
LabelUpdater(lblID); //to regular again
private void LabelUpdater(Label labelActual)
{
if (labelActual.Font.Bold)
{
Console.WriteLine("Regular - " + DateTime.Now);
labelActual.Font = new Font(labelActual.Font, FontStyle.Regular);
}
else
{
Console.WriteLine("Bold- " + DateTime.Now);
labelActual.Font = new Font(labelActual.Font, FontStyle.Bold);
}
}
但如果我尝试运行这个程序,没有任何改变。如果我只是设置为粗体,那么在执行结束时一切都会变为粗体。
要开始工作,我需要使用它:
LabelUpdater(lblIF);
Thread.Sleep(500);
Application.DoEvents(); //here
LabelUpdater(lblIF);
LabelUpdater(lblID);
Thread.Sleep(500);
Application.DoEvents(); //here
LabelUpdater(lblID);
不知道为什么,我只是尝试过并且工作过! :d
答案 0 :(得分:3)
你可以使用Timer Control而不是Thread.Sleep()
来阻止主UI
。
第1步:将Timer
控件添加到Windows Form
。
第2步:将Interval
控件的Timer
属性设置为500
(例如:1000
毫秒= 1
秒
第4步:将Enabled
属性设置为True
第5步:处理Tick
对象的Timer
事件,如下所示:
private void timer1_Tick(object sender, EventArgs e)
{
LabelUpdater(lblIF); //to bold
}
答案 1 :(得分:1)
听起来您的代码在主GUI线程上运行,是否在按钮单击处理程序中?
在当前处理程序执行完毕之前,不会处理代码中触发的事件。
尝试在后台线程上运行代码,或者转发给计时器。请注意,您需要处理对GUI的跨线程调用。
Task.StartNew(BackgroundLabelToggle, Label[] { lblIF, lblID });
private static void BackgroundLabelToggle(Label[] labels)
{
var a = labels[0];
var b = labels[1];
a.Invoke(LabelUpdater, a); //to bold
Thread.Sleep(500);
a.Invoke(LabelUpdater, a); //to regular again
b.Invoke(LabelUpdater, b); //to bold
Thread.Sleep(500);
b.Invoke(LabelUpdater, b); //to regular again
}