问题

通常我们在设置子控件的一些与外观、布局有关的属性时,比如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相关推荐

  1. WinForm 中 Control.SuspendLayout, Control.ResumeLayout, PerformLayout 之间的关系

    一般情况: 在VS视图模式下设计窗体对象后,其 InitializeComponent 方法体一般如下: private void InitializeComponent(){ // 创建各控件实例 ...

  2. 关于动态创建控件性能提高 以及 SuspendLayout ResumeLayout 的使用

    今天看UI设计  看到这个问题 参考地址:http://www.csharpwin.com/csharpspace/12492r4352.shtml 之后查的  msdn 的方法介绍 :http:// ...

  3. GeckoFX 在winform中的简单应用

    1.创建winfrom工程-过程省略 2.在NuGet程序包管理器里添加GeckoFX相关引用DLL 3.在默认窗口中添加以下代码(默认窗口放了一个进度条两个操作跳转网页按钮和一个pannel) Ge ...

  4. winform中使用ZedGraphControl控件做图

    winform中使用ZedGraphControl控件做图. 一些方法的总结 public class ChartEx : ZedGraph.ZedGraphControl{#region initp ...

  5. 在winform中从外部拖动节点到树形结构(treeview和listview相互拖动)(一)

    最近一个项目要用到从listview向treeview拖动item,达到从外部拖动图标成为树形结构的一部分,通过查阅资料总结了一些实现方式,分享给大家.这是winform中的例子. 在进行拖放操作之前 ...

  6. C# winform中MouseDoubleClick与DoubleClick的区别

    C# winform中MouseDoubleClick与DoubleClick的区别是 MouseDoubleClick:只能用鼠标双击 DoubleClick:可以按键盘的回车键

  7. C#在WinForm中实现清空指定类型控件的内容

    实现在Winform中递归控件来清空指定类型控件的内容(因为在Winform中,各个控件是有层次关系的,不能简单地依靠遍历this.controls) private void ClearConten ...

  8. winform中构造函数与Form_Load

    不都是用来初始化form中的组件么? public Form()所谓的构造函数. Form_Load所谓的窗体加载函数 完全两码事! WinForm 中的 Form_Load函数和他的构造函数 pub ...

  9. .NET WinForm中给DataGridView自定义ToolTip并设置ToolTip的样式

    .NET WinForm中的DataGridView为程序开发提供了诸多的便利,我们不需要做许多额外的工作就可以获得一些基础功能,例如点击列标题排序.行选择功能.改变列宽和行宽,以及单元格内容的自动T ...

最新文章

  1. N - Tram POJ - 1847
  2. 趣谈网络协议笔记-一
  3. CentOS 7 + MySql 中文乱码解决方案
  4. IDEA 2020 本土化,真的是全中文了,新手,开心了!
  5. 数据事业部/数据项目/数据乐高
  6. [Qt教程] 第38篇 网络(八)TCP(二)
  7. 校招小白机考入坑之从键盘输入java的各种数据类型
  8. 【Demo 0011】多媒体播放器
  9. mysql里面有没有map类型_MySQL学习(二) 数据类型
  10. mysql 转义字符6_MySQL的转义字符
  11. Hibernate性能优化之EHCache缓存
  12. 《王者荣耀》又现登录异常 官方奉上皮肤碎片+战斗经验作补偿
  13. 《metasploit渗透测试魔鬼训练营》学习笔记第九章--meterpreter
  14. 米4用linux刷机救转,小米4变砖之后如何刷机自救?大神教你小米4线刷救砖方法...
  15. 微信Java SDK开发文档
  16. 【强烈推荐】国土档案管理信息系统产品使用说明书系列目录【附下载地址】
  17. ssm + layui + poi+ 自定义注解 + java反射 做条件导出Excel 工具类
  18. 社区角色(Kubernetes社区Maintainer是什么角色?)
  19. jquery ui和easy ui联合使用
  20. 联想Y50耳机插入耳机孔后没有声音解决办法

热门文章

  1. QQ黑名单发布-轻松屏蔽指定的QQ号在本机登陆采用驱动级进程保护
  2. 2011级同学加分通知(只针对河软高校俱乐部2011级同学)
  3. Android基础—基于Socket实现上传大文件
  4. Java语言垃圾回收机制是什么_Java垃圾回收机制简述
  5. 夏普S2 android one,【夏普S2评测】系统:流畅和隽雅是Smile UX的最大特点_夏普 S2_手机评测-中关村在线...
  6. 光进铜退再掀热潮 布线须冷思考
  7. 走走北京中轴(七):午门至神武门的功课
  8. 3533----League of Legends
  9. jq数组赋值 java,jquery 遍历数组赋值的问题?
  10. 计算pi的近似值公式法_肾脏病患者小心尿毒症!医授低蛋白饮食法:重要计算公式一次曝...