我似乎无法更改任何对象上的文本 - 到目前为止我已尝试过标签和按钮。为什么这不起作用?
void Button1Click(object sender, EventArgs e)
{
for(int i = 60; i >=1; i--){
Thread.Sleep(1000);
i -= 1;
label1.Text = i.ToString();
}
}
答案 0 :(得分:4)
它不起作用,因为您使用繁忙的循环来更新文本。
此代码在主线程中运行,因此它忙于设置Text
属性一整分钟,并且无法更新用户界面。
您将使用计时器更新文本,以便主线程在更改之间重新获得控制权。
答案 1 :(得分:0)
尝试取出Thread.Sleep()命令以查看标签是否已更新。即使您请求它休眠,您也可能会发现UI线程退出该函数。
您可以使用Timer控件,并将间隔设置为1000(1秒)。然后,您可以将label1.Text设置为计数器或静态字段值(或隐藏字段)。
答案 2 :(得分:0)
只要你留在Button1Click
UI线程接缝就要睡觉了。删除Thread.Sleep
,您会看到文字显示在标签中。
答案 3 :(得分:0)
在最后一行之后将Application.DoEvents();
放入您的代码中,然后它肯定会有效。
for (int i = 60; i >= 1; i--)
{
Thread.Sleep(1000);
i -= 1;
label1.Text = i.ToString();
Application.DoEvents();
}
答案 4 :(得分:0)
首先,你必须学习How to: Make Thread-Safe Calls to Windows Forms Controls。
您需要创建一个线程并使用Invoke委托。
Thread th = new Thread(test);
th.Start(); //start the thread
此方法将更新lable.text
void test()
{
for (int i = 60; i >= 1; i--)
{
Thread.Sleep(1000);
if (label1.InvokeRequired)
{
label1.Invoke(new Action(() => {
label1.Text = i.ToString();
}));
}
}
}