今天看UI设计 看到这个问题
参考地址:http://www.csharpwin.com/csharpspace/12492r4352.shtml
之后查的 msdn 的方法介绍 :http://msdn.microsoft.com/zh-cn/library/w8k76wfs.aspx
SuspendLayout 是临时将 控件绘制 挂起
ResumeLayout 是最后一起 绘制
之前做动态控件的加载 顺手加进去了
不过有个问题是,上面的方法都是设计时的,有的时候我们的程序中如果动态的修改了某些涉及布局的属性最后发现界面乱套了,这可咋整。运行时的问题当然要运行时解决,给某个父控件附加Layout事件,当修改了涉及Layout的属性时会触发这个事件(也有特例,下一节介绍)。这个事件会有一个LayoutEventArgs参数,该参数有AffectedProperty属性,该属性指示的就是影响布局的罪魁祸首,你就找到病症所在了。
SuspendLayout & ResumeLayout
我想大家对这两个方法肯定不默认,几乎在WinForm里的InitializeComponent方法里,在方法开始处有会调用SuspendLayout方法,然后在方法快结束处会调用ResumeLayout方法。有些的读者也许还尝试过删除这两个方法,发现程序表现行为和以前也一样。
了解这两个方法对WinForm程序的性能还是挺有帮助的,在上一节提到修改涉及Layout的属性时会触发Layout事件,但是有特例,特例就是调用了SuspendLayout方法,关于修改哪些属性会触发Layout事件请查阅MSDN。在代码中如果修改Size、Dock等属性或向父控件添加子控件时,会执行布局逻辑,有的时候甚至会重绘。当我们要修改一堆的这样的属性时,比如前面提到的InitializeComponent方法,我们当然不想修改一下就执行一次布局逻辑,那太慢了。这个时候在修改之前你就可以调用SuspendLayout方法挂起布局逻辑,等所有属性都设置好后再调用ResumeLayout属性,特别是在界面很复杂的时候性能有很大的提升。
Visual Studio默认将设置这些属性的语句全部放在InitializeComponent方法里,然后用SuspendLayout和ResumeLayout括住,所以我们一般不要自作主张的将这些属性移出到外面设置,不过有的时候我们想在代码里动态生成一些界面,比如添加一些子控件什么的,我们最好也像VS干的那样调用这两个方法。
要注意的是,并不是调用了Form的SuspendLayout和ResumeLayout方法就一了百了了。如果你是向一个Panel添加子控件,你还得调用Panel的这两个方法。
-----------------------------------------------分割线----------------------------2014-7-9
无意中翻到这篇日志
记录下来,当时在收获录入的时候调用了这个方法,但是最后发现,表格table 总是控件挤在一个cell 里,而且这个偶然的问题没法重现,大约在半年前张小利发现bug并告诉了我怎么重现(赞一个,不愧为优秀员工)然后发现原来是某次抛出异常后 没有调用ResumeLayout让表格绘制,再次绘制时,就出现了与之前一起绘制的结果,然后改掉,可见两者最好是一起使用,用到SuspendLayout就最好用到ResumeLayout。