C# 为什么有些Windows UI元素会立即更新,而另一些则不会?

C# 为什么有些Windows UI元素会立即更新,而另一些则不会?,c#,winforms,user-interface,C#,Winforms,User Interface,我们有一个按钮点击事件,它启动一个长时间运行的任务,更新状态栏标签和进度控制,以向用户提供反馈。在我们将任务移动到一个单独的线程之前,我们注意到状态标签{label.text=“some message”;}(通常)会立即更新,而进度条和一些自定义控件通常在函数完成并且主UI线程再次开始发送消息之前不会更新(考虑到主UI线程,我们意识到这是有意义的)。 但这让我们不禁要问:一些windows控件是否直接重新绘制而不是发出WM_Paint消息?您的发现与我所了解的.NET控件非常矛盾。通常的规则是

我们有一个按钮点击事件,它启动一个长时间运行的任务,更新状态栏标签和进度控制,以向用户提供反馈。在我们将任务移动到一个单独的线程之前,我们注意到状态标签{label.text=“some message”;}(通常)会立即更新,而进度条和一些自定义控件通常在函数完成并且主UI线程再次开始发送消息之前不会更新(考虑到主UI线程,我们意识到这是有意义的)。

但这让我们不禁要问:一些windows控件是否直接重新绘制而不是发出WM_Paint消息?

您的发现与我所了解的.NET控件非常矛盾。通常的规则是,更改文本属性或更改前景色或后景色等属性只会导致无效()方法。这最终会导致在UI线程再次开始泵送消息时传递WM_PAINT消息。您可以调用控件或窗体的Update()方法,强制在输入慢速代码之前执行任何挂起的绘制。这完全是Windows的标准行为

ProgressBar控件是一种特殊情况。它的本机Windows实现直接更新条长度。这是compat行为,此控件通常用于无法正常泵送的代码中

TextBox具有特殊的绘制行为,它部分地直接绘制到窗口,而不是通过WM_绘制消息处理程序。当需要在386SUX机器上合理工作时,这是Windows 2的遗留行为。但这与本例无关


当然,与其为此烦恼,你不应该让自己陷入这样的境地。

如果这个问题没有一个公认的答案,我会收回最后的答案,但不允许。你介意展示一些代码吗?特别是,你的按钮点击处理程序是做什么的?我会仔细检查与开发人员进行了交流,他们看到了您所描述的内容。thx。