C# UserControl的BeginUpdate()EndUpdate

C# UserControl的BeginUpdate()EndUpdate,c#,.net,winforms,user-controls,paint,C#,.net,Winforms,User Controls,Paint,我编写了一个用户控件,其行为类似于容器控件,但完全由WindowsForms绘制(我继承自用户控件) 我希望在填充控件时避免绘制控件,因此我需要编写类似于BeginUpdate()-EndUpdate()的内容 当控件由用户绘制时,这很容易做到,但在这种情况下,我不确定如何继续。您可以使用暂停/恢复布局。e、 g private void BeginUpdate() { this.SuspendLayout(); // Do paint events EndUpdate(); }

我编写了一个用户控件,其行为类似于容器控件,但完全由WindowsForms绘制(我继承自
用户控件

我希望在填充控件时避免绘制控件,因此我需要编写类似于
BeginUpdate()
-
EndUpdate()
的内容


当控件由用户绘制时,这很容易做到,但在这种情况下,我不确定如何继续。

您可以使用暂停/恢复布局。e、 g

private void BeginUpdate()
{
  this.SuspendLayout();
  // Do paint events
  EndUpdate();
}

private void EndUpdate()
{
   this.ResumeLayout();
   // Raise an event if needed.
}

如果您对暂停控件及其子控件的绘制感兴趣,请查看以下问题:

您可以重写OnPaint方法,并仅在满足特定条件时将控件传递回base.OnPaint()

    private bool _doPaint = true;
    protected override void OnPaint(PaintEventArgs e)
    {
        if(_doPaint)
            base.OnPaint(e);
    }
然后使用公共方法或属性将_doPaint变量设置为适当的值


根据需要,您可能必须以类似的方式重写OnPaintBackground()。

据我所知,SuspendLayout不一定会停止控件的绘制。它在诸如FlowLayoutPanel之类的容器上非常有用,FlowLayoutPanel对其子级执行布局操作。它将用于避免在每次向面板添加控件(例如在循环中)时执行布局操作。我可能错了,但是如果你有更多的信息,我希望你能提供。我选择了这个方法。由于我的控件是供其他开发人员使用的,因此我还添加了一个安全计时器,该计时器在1500毫秒后重新启用
\u doPaint
1500毫秒,以防他们的代码无法正确打开它。