ToolStripStatusLabel的行为与其他类类型控件不同

本文关键字:类型 控件 其他 ToolStripStatusLabel | 更新日期: 2023-09-27 18:27:11

我在Winforms应用程序中使用ToolStripStatusLabel时遇到一些问题。为了更好地解释,我在这里有一些代码

bottomLbl.Text = "Adding file(s) to list...";
this.Text = "Adding file(s) to list...";
listAllFiles(carrier, type, chkListBox, withDestSystem, listBox, cmbBox);
bottomLbl.Text = "Done!";
this.Text = "Done";

我没有得到的是,this.Text确实更改为"添加文件..",但不是bottomLbl,即使我在this.text之前将其设置为这样做。运行listAllFiles函数后,两个控件都会获得"完成!"文本。

但是,在ToolStripStatusLabel上,我有什么特别的事情要做吗?

ToolStripStatusLabel的行为与其他类类型控件不同

在调用函数之前,您需要刷新表单

bottomLbl.Text = "Adding file(s) to list...";
this.Text = "Adding file(s) to list...";
this.Refresh();
listAllFiles(carrier, type, chkListBox, withDestSystem, listBox, cmbBox);
bottomLbl.Text = "Done!";
this.Text = "Done";

在我看来,您正在设置一个条件,我们无法可靠地预测在显示最终UI更新之前,哪些UI更新将显示在屏幕上。

在执行耗时的过程(listAllFiles())之前,您正在进行一些UI更新(例如label1.Text=…)。完成后,您将进行更多(最终)UI更新。

一个或多个";"早";一旦主线程(UI线程)有时间刷新窗口,UI更新就会排队显示。

我们不一定知道的是,哪些类型的控件(例如ToolStripStatusLabel与Label)内部认为其Text属性的设置迫不及待地要显示。

这听起来有点像其中一种类型将允许其Text属性在不等待显示之前进行更新(这是一个非阻塞调用),而另一种类型则将确保在继续之前显示更改(这是阻塞调用)。

即使你通过测试来确定他们的行为,它也可能在未来或不同的环境中发生变化。

也可以自定义其中一个或多个类型,以指定是否阻止。您可以通过调用Refresh()或Invalidate()来完成此操作。但我推荐另一种方法:

将UI线程中执行的任务负载保持在最低限度。通过这种方式,UI对用户的响应更灵敏,您可以更有信心快速显示UI更新。

一般来说,这意味着我们应该在不同的线程中异步执行所有耗时的工作,并且我们可以根据工作的状态随时更新UI。为了实现这一点,我建议研究BackgroundWorker类型。它的目的是异步执行耗时的工作,同时维护响应式UI。