• 挖一下 SuspendLayout, ResumeLayout 的原理


    最近看到一些 winform 控件的写法里面,在设定 DockStyle 或者增减子控件的时候,往往先调用 SuspendLayout 方法,操作完毕之后调用一下 ResumeLayout. 不太明白其中的道理。所以用 Reflector 来看一下。
    代码在 System.Windows.Forms.Control 中。
    做一个简单的记录如下:

    public void SuspendLayout()
    {
          
    this.layoutSuspendCount = (byte) (this.layoutSuspendCount + 1);
    }


    public void ResumeLayout()
    {
          
    this.ResumeLayout(true);
    }
     

    public void ResumeLayout(bool performLayout)
    {
          
    if (this.layoutSuspendCount > 0)
          
    {
                
    this.layoutSuspendCount = (byte) (this.layoutSuspendCount - 1);
                
    if (((this.layoutSuspendCount == 0&& ((this.state & 0x200!= 0)) && performLayout)
                
    {
                      
    this.PerformLayout();
                }

          }

          
    if (!performLayout)
          
    {
                Control.ControlCollection collection1 
    = (Control.ControlCollection) this.Properties.GetObject(Control.PropControlsCollection);
                
    if (collection1 != null)
                
    {
                      
    for (int num1 = 0; num1 < collection1.Count; num1++)
                      
    {
                            Control.LayoutManager.UpdateAnchorInfo(collection1[num1]);
                      }

                }

          }

    }

     
    [EditorBrowsable(EditorBrowsableState.Advanced)]
    public void PerformLayout()
    {
          
    this.PerformLayout(nullnull);
    }

     
    [EditorBrowsable(EditorBrowsableState.Advanced)]
    public void PerformLayout(Control affectedControl, string affectedProperty)
    {
          
    if (!this.GetAnyDisposingInHierarchy())
          
    {
                
    if (this.layoutSuspendCount > 0)
                
    {
                      
    this.state |= 0x200;
                }

                
    else
                
    {
                      
    this.layoutSuspendCount = 1;
                      
    try
                      
    {
                            
    this.OnLayout(new LayoutEventArgs(affectedControl, affectedProperty));
                      }

                      
    finally
                      
    {
                            
    this.state &= -513;
                            
    this.layoutSuspendCount = 0;
                      }

                }

          }

    }

     

  • 相关阅读:
    STM32F10x_ADC三通道逐次转换(单次、单通道软件触发)
    STM32F10x_RTC日历
    STM32F4_TIM输入波形捕获(脉冲频率)
    详解 C 语言开发五子棋游戏以及游戏中的重要算法与思路
    平安银行 深度解析梧州模式 或许是国内医药分开最好的模板!
    屏蔽双绞线和非屏蔽双绞线之间的区别
    如何刷新本地的DNS缓存?
    无线网络发射和接收的物理原理!
    wifi基本原理
    大润发创始人黄明端挥泪离场:我战胜了所有对手,却输给了时代!
  • 原文地址:https://www.cnblogs.com/RChen/p/161379.html
Copyright © 2020-2023  润新知