WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载
来源:互联网 发布:mac google搜索打不开 编辑:程序博客网 时间:2024/05/20 15:39
问题
通常我们在设置子控件的一些与外观、布局有关的属性时,比如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方法来提高重绘效率,减少闪烁。
通常我们在设置子控件的一些与外观、布局有关的属性时,比如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方法来提高重绘效率,减少闪烁。
阅读全文
0 0
- WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载
- WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载
- WinForm-SuspendLayout、ResumeLayout、PerformLayou
- WinForm-SuspendLayout、ResumeLayout、PerformLayou
- C# WinForm中的SuspendLayout、ResumeLayout、PerformLayou
- 对WinForm-SuspendLayout、ResumeLayout、PerformLayout的理解
- WinForm 中 Control.SuspendLayout, Control.ResumeLayout, PerformLayout 之间的关系
- SuspendLayout 和 ResumeLayout 方法
- SuspendLayout 和 ResumeLayout
- C# SuspendLayout()和ResumeLayout()
- 使用SuspendLayout和ResumeLayout
- ResumeLayout、SuspendLayout、PerformLayout
- 使用SuspendLayout和ResumeLayout
- suspendlayout,resumelayout,layout,performlayout【转】
- suspendlayout,resumelayout,layout,performlayout【转】
- Control.SuspendLayout 方法 ResumeLayout 方法 (Boolean)
- 挖一下 SuspendLayout, ResumeLayout 的原理
- 利用SuspendLayout 和 ResumeLayout 方法加速添加控件
- Spark官方文档翻译思路与进度表
- easyUI的iframe子页面操作父页面元素
- 手机端rem布局详解(淘宝无限适配)
- stl迭代器失效
- loj6226「网络流 24 题」骑士共存问题(二分图最大点独立集,最小割)
- WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载
- AS3:时间戳的转换
- NLP汉语自然语言处理原理与实践 9 NLP中的深度学习
- ${}和#{}的区别
- struts2-21常用标签解说
- 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!
- 实参和形参
- HTTP协议状态码详解(HTTP Status Code)
- AndroidStudio安装流程