【问题标题】:BeginUpdate() EndUpdate for a UserControl用户控件的 BeginUpdate() EndUpdate
【发布时间】:2011-06-27 00:21:49
【问题描述】:

我编写了一个 UserControl,其行为类似于 ContainerControl,但完全由 WindowsForms 绘制(我继承自 UserControl

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

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

【问题讨论】:

    标签: c# .net winforms user-controls paint


    【解决方案1】:

    您可以使用暂停/恢复布局。例如

    private void BeginUpdate()
    {
      this.SuspendLayout();
      // Do paint events
      EndUpdate();
    }
    
    private void EndUpdate()
    {
       this.ResumeLayout();
       // Raise an event if needed.
    }
    

    如果您有兴趣暂停控件及其子控件的绘制,请查看这个 SO 问题:Suspend Control and Children Painting

    【讨论】:

    • 据我了解,SuspendLayout 并不一定会阻止控件绘制。它在诸如 FlowLayoutPanel 之类的容器上非常有用,它对其子项执行布局操作。它将用于避免每次将控件添加到面板时执行布局操作,比如在循环中。我可能是错的,但如果你有任何信息,我会喜欢更多信息。
    【解决方案2】:

    您可以覆盖 OnPaint 方法,仅在满足特定条件时将控制权传递回 base.OnPaint()。

        private bool _doPaint = true;
        protected override void OnPaint(PaintEventArgs e)
        {
            if(_doPaint)
                base.OnPaint(e);
        }
    

    然后使用公共方法或属性将 _doPaint 变量设置为适当的值。

    您可能需要以类似的方式覆盖 OnPaintBackground(),具体取决于您的需要。

    【讨论】:

    • 我选择了这种方法。由于我的控件是供其他开发人员使用的,所以我还添加了一个安全计时器,可以在 1500 毫秒后重新启用_doPaint,以防他们的代码无法正确打开它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2014-03-04
    相关资源
    最近更新 更多