关于动态创建控件性能提高 以及 SuspendLayout ResumeLayout 的使用
今天看UI設計??看到這個問題
參考地址:http://www.csharpwin.com/csharpspace/12492r4352.shtml
之后查的??msdn?的方法介紹?:http://msdn.microsoft.com/zh-cn/library/w8k76wfs.aspx
SuspendLayout?是臨時將?控件繪制??掛起?
ResumeLayout??是最后一起??繪制
?
之前做動態(tài)控件的加載??順手加進去了?
?
不過有個問題是,上面的方法都是設計時的,有的時候我們的程序中如果動態(tài)的修改了某些涉及布局的屬性最后發(fā)現(xiàn)界面亂套了,這可咋整。運行時的問題當然要運行時解決,給某個父控件附加Layout事件,當修改了涉及Layout的屬性時會觸發(fā)這個事件(也有特例,下一節(jié)介紹)。這個事件會有一個LayoutEventArgs參數(shù),該參數(shù)有AffectedProperty屬性,該屬性指示的就是影響布局的罪魁禍首,你就找到病癥所在了。
SuspendLayout?&?ResumeLayout?
我想大家對這兩個方法肯定不默認,幾乎在WinForm里的InitializeComponent方法里,在方法開始處有會調(diào)用SuspendLayout方法,然后在方法快結(jié)束處會調(diào)用ResumeLayout方法。有些的讀者也許還嘗試過刪除這兩個方法,發(fā)現(xiàn)程序表現(xiàn)行為和以前也一樣。
了解這兩個方法對WinForm程序的性能還是挺有幫助的,在上一節(jié)提到修改涉及Layout的屬性時會觸發(fā)Layout事件,但是有特例,特例就是調(diào)用了SuspendLayout方法,關(guān)于修改哪些屬性會觸發(fā)Layout事件請查閱MSDN。在代碼中如果修改Size、Dock等屬性或向父控件添加子控件時,會執(zhí)行布局邏輯,有的時候甚至會重繪。當我們要修改一堆的這樣的屬性時,比如前面提到的InitializeComponent方法,我們當然不想修改一下就執(zhí)行一次布局邏輯,那太慢了。這個時候在修改之前你就可以調(diào)用SuspendLayout方法掛起布局邏輯,等所有屬性都設置好后再調(diào)用ResumeLayout屬性,特別是在界面很復雜的時候性能有很大的提升。
Visual?Studio默認將設置這些屬性的語句全部放在InitializeComponent方法里,然后用SuspendLayout和ResumeLayout括住,所以我們一般不要自作主張的將這些屬性移出到外面設置,不過有的時候我們想在代碼里動態(tài)生成一些界面,比如添加一些子控件什么的,我們最好也像VS干的那樣調(diào)用這兩個方法。
要注意的是,并不是調(diào)用了Form的SuspendLayout和ResumeLayout方法就一了百了了。如果你是向一個Panel添加子控件,你還得調(diào)用Panel的這兩個方法。
-----------------------------------------------分割線----------------------------2014-7-9
無意中翻到這篇日志
記錄下來,當時在收獲錄入的時候調(diào)用了這個方法,但是最后發(fā)現(xiàn),表格table 總是控件擠在一個cell 里,而且這個偶然的問題沒法重現(xiàn),大約在半年前張小利發(fā)現(xiàn)bug并告訴了我怎么重現(xiàn)(贊一個,不愧為優(yōu)秀員工)然后發(fā)現(xiàn)原來是某次拋出異常后 沒有調(diào)用ResumeLayout讓表格繪制,再次繪制時,就出現(xiàn)了與之前一起繪制的結(jié)果,然后改掉,可見兩者最好是一起使用,用到SuspendLayout就最好用到ResumeLayout。
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/jilodream/archive/2013/03/08/4222739.html
總結(jié)
以上是生活随笔為你收集整理的关于动态创建控件性能提高 以及 SuspendLayout ResumeLayout 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态显示选项框
- 下一篇: Win Phone 8 实现页面导航