zoukankan      html  css  js  c++  java
  • WinFormSuspendLayout、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#窗体设计器生成的代码

    /// <summary>
    /// 设计器支持所需的方法 - 不要
    /// 使用代码编辑器修改此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.panel1.SuspendLayout();
    this.SuspendLayout();

    ......//这里设置控件属性

    ......//这里设置控件属性
    this.panel1.ResumeLayout(false);
    this.ResumeLayout(false);
    }

    从代码中可以看出,窗体设计器自动生成代码时也是在大规模改变控件属性(这些属性会决定控件布局)的时候使用到了控件的PerformLayout与ResumeLayout方法来提高重绘效率,减少闪烁。

  • 相关阅读:
    [CodeForces]Codeforces Round #429 (Div. 2) ABC(待补)
    About Me
    2018-06-14
    Codeforces Codeforces Round #484 (Div. 2) E. Billiard
    Codeforces Codeforces Round #484 (Div. 2) D. Shark
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes
    Codeforces Avito Code Challenge 2018 D. Bookshelves
    Codeforces Round #485 (Div. 2) D. Fair
    Codeforces Round #485 (Div. 2) F. AND Graph
  • 原文地址:https://www.cnblogs.com/si-shaohua/p/2296129.html
Copyright © 2011-2022 走看看