0

我在 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 上做些什么特别的事情吗?

4

2 回答 2

1

调用函数前需要刷新表单

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";
于 2014-10-19T00:49:12.217 回答
0

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

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

只要主线程(UI 线程)有时间刷新窗口,一个或多个“早期”UI 更新就会排队显示。

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

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

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

或者,您可以自定义一种或多种这些类型以指定是否阻止。您可以通过调用 Refresh() 或 Invalidate() 来做到这一点。但我推荐另一种方法:

将 UI 线程中执行的任务负载降至最低。这样,UI 对用户的响应速度更快,您可以更有信心快速显示您的 UI 更新。

通常,这意味着我们应该在不同的线程中异步执行所有耗时的工作,并且我们可以根据需要随时更新 UI 与该工作的状态。为此,我建议查看 BackgroundWorker 类型。其目的是在保持响应式 UI 的同时异步执行耗时的工作。

于 2021-11-10T17:31:32.403 回答