不能更改对象上的文本
本文关键字:文本 对象 不能 | 更新日期: 2023-09-27 18:17:50
我似乎无法改变任何对象上的文本-到目前为止,我已经尝试了标签和按钮。为什么这行不通呢?
void Button1Click(object sender, EventArgs e)
{
for(int i = 60; i >=1; i--){
Thread.Sleep(1000);
i -= 1;
label1.Text = i.ToString();
}
}
这不起作用,因为您正在使用忙循环来更新文本。
这段代码在主线程中运行,所以它要花整整一分钟的时间来设置Text
属性,而不能更新用户界面。
您将使用计时器来更新文本,以便主线程在更改之间重新获得控制权。
尝试执行Thread.Sleep()命令,查看标签是否已更新。你可能会发现UI线程退出了函数,即使你请求它休眠。
你能做的是使用定时器控制,并将间隔设置为1000(1秒)。然后可以设置label1。文本到计数器或静态字段值(或隐藏字段)。
只要你呆在Button1Click
UI线程接缝睡觉。删除Thread.Sleep
,您将看到文本显示在标签中。
将Application.DoEvents();
放在代码的最后一行之后,那么它肯定会工作。
for (int i = 60; i >= 1; i--)
{
Thread.Sleep(1000);
i -= 1;
label1.Text = i.ToString();
Application.DoEvents();
}
首先,你必须学习如何:使线程安全调用Windows窗体控件。
你需要创建一个线程并使用Invoke delegate。
Thread th = new Thread(test);
th.Start(); //start the thread
这个方法将更新label .text
void test()
{
for (int i = 60; i >= 1; i--)
{
Thread.Sleep(1000);
if (label1.InvokeRequired)
{
label1.Invoke(new Action(() => {
label1.Text = i.ToString();
}));
}
}
}