关于动态创建控件性能提高 以及 SuspendLayout ResumeLayout 的使用
今天看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。
?
?
?
轉載于:https://www.cnblogs.com/jilodream/archive/2013/03/08/4222739.html
總結
以上是生活随笔為你收集整理的关于动态创建控件性能提高 以及 SuspendLayout ResumeLayout 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动态显示选项框
- 下一篇: Win Phone 8 实现页面导航