C# 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#窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.panel1.SuspendLayout();
this.SuspendLayout();
......//这里设置控件属性
......//这里设置控件属性
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
从代码中可以看出,窗体设计器自动生成代码时也是在大规模改变控件属性(这些属性会决定控件布局)的时候使用到了控件的PerformLayout与ResumeLayout方法来提高重绘效率,减少闪烁。
原文地址:http://www.cnblogs.com/si-shaohua/archive/2011/12/21/2296129.html
C# WinForm中的SuspendLayout、ResumeLayout、PerformLayou相关推荐
- WinForm 中 Control.SuspendLayout, Control.ResumeLayout, PerformLayout 之间的关系
一般情况: 在VS视图模式下设计窗体对象后,其 InitializeComponent 方法体一般如下: private void InitializeComponent(){ // 创建各控件实例 ...
- 关于动态创建控件性能提高 以及 SuspendLayout ResumeLayout 的使用
今天看UI设计 看到这个问题 参考地址:http://www.csharpwin.com/csharpspace/12492r4352.shtml 之后查的 msdn 的方法介绍 :http:// ...
- GeckoFX 在winform中的简单应用
1.创建winfrom工程-过程省略 2.在NuGet程序包管理器里添加GeckoFX相关引用DLL 3.在默认窗口中添加以下代码(默认窗口放了一个进度条两个操作跳转网页按钮和一个pannel) Ge ...
- winform中使用ZedGraphControl控件做图
winform中使用ZedGraphControl控件做图. 一些方法的总结 public class ChartEx : ZedGraph.ZedGraphControl{#region initp ...
- 在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)
最近一个项目要用到从listview向treeview拖动item,达到从外部拖动图标成为树形结构的一部分,通过查阅资料总结了一些实现方式,分享给大家.这是winform中的例子. 在进行拖放操作之前 ...
- C# winform中MouseDoubleClick与DoubleClick的区别
C# winform中MouseDoubleClick与DoubleClick的区别是 MouseDoubleClick:只能用鼠标双击 DoubleClick:可以按键盘的回车键
- C#在WinForm中实现清空指定类型控件的内容
实现在Winform中递归控件来清空指定类型控件的内容(因为在Winform中,各个控件是有层次关系的,不能简单地依靠遍历this.controls) private void ClearConten ...
- winform中构造函数与Form_Load
不都是用来初始化form中的组件么? public Form()所谓的构造函数. Form_Load所谓的窗体加载函数 完全两码事! WinForm 中的 Form_Load函数和他的构造函数 pub ...
- .NET WinForm中给DataGridView自定义ToolTip并设置ToolTip的样式
.NET WinForm中的DataGridView为程序开发提供了诸多的便利,我们不需要做许多额外的工作就可以获得一些基础功能,例如点击列标题排序.行选择功能.改变列宽和行宽,以及单元格内容的自动T ...
最新文章
- N - Tram POJ - 1847
- 趣谈网络协议笔记-一
- CentOS 7 + MySql 中文乱码解决方案
- IDEA 2020 本土化,真的是全中文了,新手,开心了!
- 数据事业部/数据项目/数据乐高
- [Qt教程] 第38篇 网络(八)TCP(二)
- 校招小白机考入坑之从键盘输入java的各种数据类型
- 【Demo 0011】多媒体播放器
- mysql里面有没有map类型_MySQL学习(二) 数据类型
- mysql 转义字符6_MySQL的转义字符
- Hibernate性能优化之EHCache缓存
- 《王者荣耀》又现登录异常 官方奉上皮肤碎片+战斗经验作补偿
- 《metasploit渗透测试魔鬼训练营》学习笔记第九章--meterpreter
- 米4用linux刷机救转,小米4变砖之后如何刷机自救?大神教你小米4线刷救砖方法...
- 微信Java SDK开发文档
- 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】
- ssm + layui + poi+ 自定义注解 + java反射 做条件导出Excel 工具类
- 社区角色(Kubernetes社区Maintainer是什么角色?)
- jquery ui和easy ui联合使用
- 联想Y50耳机插入耳机孔后没有声音解决办法
热门文章
- QQ黑名单发布-轻松屏蔽指定的QQ号在本机登陆采用驱动级进程保护
- 2011级同学加分通知(只针对河软高校俱乐部2011级同学)
- Android基础—基于Socket实现上传大文件
- Java语言垃圾回收机制是什么_Java垃圾回收机制简述
- 夏普S2 android one,【夏普S2评测】系统:流畅和隽雅是Smile UX的最大特点_夏普 S2_手机评测-中关村在线...
- 光进铜退再掀热潮 布线须冷思考
- 走走北京中轴(七):午门至神武门的功课
- 3533----League of Legends
- jq数组赋值 java,jquery 遍历数组赋值的问题?
- 计算pi的近似值公式法_肾脏病患者小心尿毒症!医授低蛋白饮食法:重要计算公式一次曝...