Control.Refresh 方法
- 强制控件使其工作区无效并立即重绘自己和任何子控件。
反编译源码:
public virtual void Refresh()
{
this.Invalidate(true);
this.Update();
}
Control.Invalidate 方法
- 使控件的特定区域无效并向控件发送绘制消息。
名称 | 说明 | |
---|---|---|
Invalidate() | 使控件的整个图面无效并导致重绘控件。 | |
Invalidate(Boolean) | 使控件的特定区域无效并向控件发送绘制消息。还可以使分配给该控件的子控件无效。 | |
Invalidate(Rectangle) | 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 | |
Invalidate(Region) | 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。 | |
Invalidate(Rectangle, Boolean) | 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。 | |
Invalidate(Region, Boolean) | 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。 |
备注
调用 Invalidate 方法并不强制同步绘制;若要强制同步绘制,请在调用 Invalidate 方法之后调用 Update 方法。在不带参数的情况下调用此方法时,会将整个工作区添加到更新区域。
Control.Update 方法
使控件重绘其工作区内的无效区域。
备注
执行所有对绘制的挂起请求。
有两种重新绘制窗体及其内容的方法:
您可以将 Invalidate 方法的重载之一与 Update 方法一起使用。
可以调用 Refresh 方法,此方法强制控件重新绘制其自身及其所有子级。这等效于将 Invalidate 方法设置为 true 并将该方法与 Update 一起使用。
Invalidate 方法控制绘制或重新绘制的内容。Update 方法控制发生绘制或重新绘制的时间。如果将 Invalidate 和 Update 方法一起使用,而不是调用 Refresh,则重新绘制的内容取决于您使用的 Invalidate 的重载。Update 方法仅仅是强制立即绘制控件,而 Invalidate 方法则控制当您调用 Update 方法时所绘制的内容。
示例代码:
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = "XXX";
textBox1.Invalidate();
//textBox1.Update();
//textBox1.Refresh();
Thread.Sleep(3000);
textBox1.Text = "YYY";
}
由于Thread.Sleep这一句的存在,虽然textBox1执行了Invalidate,但是并没有显示"XXX",而是在3秒钟之后直接显示了"YYY";
如果去除Update或者Refresh的注释,才可以实现先显示"XXX",3秒钟之后再显示"YYY"。
Control.Update 方法:使控件重绘其工作区内的无效区域。
Control.Refresh 方法:强制控件使其工作区无效并立即重绘自己和任何子控件,等效于将 Invalidate 方法设置为 true 并将该方法与 Update 一起使用。
那么既然有了Update,为何还要存在Invalidate呢?
原因是Invalidate有重载的版本例如:Invalidate(Rectangle, Boolean) 使控件的指定区域无效(将其添加到控件的更新区域,下次绘制操作时将重新绘制更新区域),并向控件发送绘制消息。还可以使分配给该控件的子控件无效。
其实Invalidate 方法控制绘制或重新绘制的内容。Update 方法才是控制发生绘制或重新绘制的时间(即执行重绘制命名)。