WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载
問題
通常我們在設置子控件的一些與外觀、布局有關的屬性時,比如Size、Location、Anchor或Dock等,會激發子控件的 Layout事件,并可能會引起窗口重繪。當子控件較多時,如果頻繁設置上述屬性(例如在窗體的初始化代碼中),多個子控件的Layout事件會引起窗口重繪效率問題,比如閃爍。特別地,通過動態加載插件生成的UI對象特別多時,閃爍的情況就特別嚴重。那么怎么解決這個問題呢?
解決
這時,通過使用控件的SuspendLayout方法,可以將控件的布局暫時掛起,其后的代碼中將會把子控件的Layout事件暫時掛起,只是把相應屬性的值設置為新值,并不激發Layout事件,待調用ResumeLayout方法后,再一起使子控件的Layout事件生效。當需要立即執行布局事件時,可以直接調用PerformLayout方法。
Q&A
1.什么時候會觸發Control.Layout事件?
(1)當控件本身的大小(Size)改變時會觸發本控件的Layout事件
(2)當其子控件的位置(Location)改變時會觸發它的Layout事件。
(3)添加或刪除子控件也會引起它的Layout事件。
(4)發生其他可影響控件布局的變化時會引起它的Layout事件。
2.SuspendLayout方法作何用?
在添加或移除子控件,控件的邊界改變,以及在發生其他可影響控件布局的變化時,會發生 Layout 事件。可以使用SuspendLayout掛起布局,可以在控件上執行多個操作,而無需為每次更改執行一次布局操作。也就是說,有了這個語句之后,緊接著下面的添加刪除子控件,或者改變子控件的大小、位置及改變它自身的位置的這些操作,都不在引發Layout事件了。
3. ResumeLayout方法作何用?
通過ResumeLayout方法可以取消掛起的布局。以后布局改變的時候就會引發Layout事件了。
4. PerformLayout方法作何用?
ResumeLayout方法可以取消掛起的布局,使以后的布局均有效,但是并不能保證布局的立即執行。如果要使布局立即執行(即立即觸發Layout事件),可以調用PerformLayout方法強制布局,強制控件將布局邏輯應用于自身及其子控件。
C#窗體設計器生成的代碼
從代碼中可以看出,窗體設計器自動生成代碼時也是在大規模改變控件屬性(這些屬性會決定控件布局)的時候使用到了控件的PerformLayout與ResumeLayout方法來提高重繪效率,減少閃爍。
轉載于:https://www.cnblogs.com/vaevvaev/p/7235341.html
總結
以上是生活随笔為你收集整理的WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 道恩股份是做什么的
- 下一篇: Android - 网络基础