C# UserControl Invalidate()方法。如何正确地使UserControl中的子控件无效

C# UserControl Invalidate()方法。如何正确地使UserControl中的子控件无效,c#,user-controls,invalidation,C#,User Controls,Invalidation,我已经创建了UserControl类,一切都正常工作。只是想知道Invalidate是做什么的。它实际上不会使我的类中的控件无效,并且在调用它时我没有发现任何效果。有人能解释一下这个方法在UserControl类中的作用吗 要使用户控件无效所有嵌套的控件,您需要调用以下特殊重载: 使控件的特定区域无效并导致绘制 要发送到控件的消息。(可选)使子项无效 分配给控件的控件 请注意以下备注: 评论 调用Invalidate方法不会强制同步绘制;到 强制同步绘制,在调用 使方法无效。当在没有参数的情况下

我已经创建了UserControl类,一切都正常工作。只是想知道Invalidate是做什么的。它实际上不会使我的类中的控件无效,并且在调用它时我没有发现任何效果。有人能解释一下这个方法在UserControl类中的作用吗


要使
用户控件
无效
所有嵌套的控件,您需要调用以下特殊重载:

使控件的特定区域无效并导致绘制 要发送到控件的消息。(可选)使子项无效 分配给控件的控件

请注意以下备注:

评论

调用Invalidate方法不会强制同步绘制;到 强制同步绘制,在调用 使方法无效。当在没有参数的情况下调用此方法时 整个客户端区域将添加到更新区域

更新

如果要从UI线程以外的线程调用此函数,则需要使用
Invoke
,可能如下所示:

public delegate void InvalidateUC();
public InvalidateUC myInvalidateDelegate;

public void InvalidateMethod()
{
    yourUserControl1.Invalidate(true);
}
现在,在做了

myInvalidateDelegate = new InvalidateUC(InvalidateMethod);
您可以从另一个线程调用它

yourForm.yourUserControl1.Invoke(myInvalidateDelegate);
请注意,如果您不确定调用是否真正来自非ui线程,则可以(并且应该)添加条件

if (yourForm.yourUserControl1.InvokeRequired)..

要使
用户控件
无效
所有嵌套控件,需要调用以下特殊重载:

使控件的特定区域无效并导致绘制 要发送到控件的消息。(可选)使子项无效 分配给控件的控件

请注意以下备注:

评论

调用Invalidate方法不会强制同步绘制;到 强制同步绘制,在调用 使方法无效。当在没有参数的情况下调用此方法时 整个客户端区域将添加到更新区域

更新

如果要从UI线程以外的线程调用此函数,则需要使用
Invoke
,可能如下所示:

public delegate void InvalidateUC();
public InvalidateUC myInvalidateDelegate;

public void InvalidateMethod()
{
    yourUserControl1.Invalidate(true);
}
现在,在做了

myInvalidateDelegate = new InvalidateUC(InvalidateMethod);
您可以从另一个线程调用它

yourForm.yourUserControl1.Invoke(myInvalidateDelegate);
请注意,如果您不确定调用是否真正来自非ui线程,则可以(并且应该)添加条件

if (yourForm.yourUserControl1.InvokeRequired)..

它从控件继承方法。这样做很简单,它强制再次生成绘制事件。用UserControl.Paint做任何花哨的事情都是不寻常的。我也有同样的想法,但我需要实现自己的一个,以使UserControl中的控件无效。这就是我问的原因。我知道理论上它是继承的。“Invalidate”指的是显示的像素,而不是控件的任何功能。如果您对Paint/OnPaint事件进行编码并希望它发生,例如在更改某些参数(如画笔颜色或绘制的直线坐标等)后,您可以使用它请注意,它将传播到所有嵌套控件。@TaW我确实理解它。我只是认为Invalidate将使作为UserControl一部分的控件无效。但是不会调用它们的Invalidate方法。我通过编写自己的方法使子控件无效,找到了解决方法。但我只是想,如果我没有错过什么。不,它不会调用它们的Invalidate,但它应该触发它们的Paint/OnPaint事件,因为它将确保所有必要的像素都被重新绘制。它从控件继承了该方法。这样做很简单,它强制再次生成绘制事件。用UserControl.Paint做任何花哨的事情都是不寻常的。我也有同样的想法,但我需要实现自己的一个,以使UserControl中的控件无效。这就是我问的原因。我知道理论上它是继承的。“Invalidate”指的是显示的像素,而不是控件的任何功能。如果您对Paint/OnPaint事件进行编码并希望它发生,例如在更改某些参数(如画笔颜色或绘制的直线坐标等)后,您可以使用它请注意,它将传播到所有嵌套控件。@TaW我确实理解它。我只是认为Invalidate将使作为UserControl一部分的控件无效。但是不会调用它们的Invalidate方法。我通过编写自己的方法使子控件无效,找到了解决方法。但我只是想,如果我没有遗漏什么,它不会调用它们的Invalidate,但它应该触发它们的Paint/OnPaint事件,因为它将确保所有必要的像素都被重新绘制。