问题

通常我们在设置子控件的一些与外观、布局有关的属性时,比如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方法来提高重绘效率,减少闪烁。

转载于:https://www.cnblogs.com/vaevvaev/p/7235341.html

WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载相关推荐

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

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

  2. WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题解决方案

    在做winform程序开发时,我用DataSource绑定了ListBox中的Item,但是当我进行一些添加.删除操作时就报了这个错"设置DataSource属性后无法修改项集合" ...

  3. 在 WinForm 中使用 Direct2D

    在 C# 的 WinForm 应用中,界面的绘制使用的是 GDI+.不过在一些特别的应用中,可能需要用硬件加速来提高绘制的效率.下面就来介绍两种在 WinForm 应用中嵌入 Direct2D 的方法 ...

  4. 通过winform+模拟登录实现快速一键登录到人才招聘网站

    之前为了便于人事部门招聘登录网站更简洁高效,免去每天频繁输网址.用户名.密码等相关登录信息,特基于winform+HttpWebRequest实现模拟请求登录,最终达到一键登录到招聘网站后台的效果. ...

  5. winform屏蔽Alt+F4组合键以防止用户关闭对话框

    winform屏蔽Alt+F4组合键以防止用户关闭对话框,屏蔽Alt + F4的方法有很多,这里列出了一个比较简单而奏效的方法. 1. 捕获窗体的KeyDown事件 给窗体添加KeyDown事件,然后 ...

  6. WPF关闭应用程序,释放Window窗口资源方法

    WindowsForm里一个Application.Exit();方法就可以关闭应用程序,释放掉资源. WPF里Application类没有该方法,但是有一个Exit的事件驱动,在WPF应用程序里面关 ...

  7. C#中的MessageBox消息对话框

    关键字:C# MessageBox 消息对话框 在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消 ...

  8. C# WinForm中的SuspendLayout、ResumeLayout、PerformLayou

    问题 通常我们在设置子控件的一些与外观.布局有关的属性时,比如Size.Location.Anchor或Dock等,会激发子控件的 Layout事件,并可能会引起窗口重绘.当子控件较多时,如果频繁设置 ...

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

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

最新文章

  1. java二个整数相减_Java-消息框显示两整数加减乘除
  2. Mysql进阶(4)——基于MHA的MySQL高可用架构
  3. Ado.net连接池 sp_reset_connection 概念
  4. 记-安装pillow
  5. 牛客网——今年的第几天
  6. VHDL中的转换函数
  7. Array | 74. Search a 2D Matrix
  8. Spring Cloud项目MVN编译 -- Non-resolvable import POM
  9. 金币(信息学奥赛一本通-T1100)
  10. 【毕业设计】一种多商家网络商店的设计与实现(源代码+论文)
  11. 江苏计算机一级考试知识点,江苏计算机考试一级题型(江苏省计算机一级考试题型)...
  12. Keras:我的第一个神经网络二分类模型
  13. 三种常用数据标准化方法
  14. 问题服务器防火墙的选择
  15. 苹果MAC电脑双系统教程——MAC安装Windows双系统教程
  16. Java实现找零问题
  17. 360权重是什么,360权重怎么查询
  18. 财经小知识:美国国债
  19. matlab RGB到HSI的彩色转换及实现
  20. 吞吐量和IOPS测试

热门文章

  1. Scala数组元素的修改update
  2. CentOS 和 Linux的关系?
  3. Spring MVC入门示例教程--静态页面跳转
  4. C++之dynamic_cast、static_cast、const_cast、reinterpret_cast的用法和区别
  5. 为啥八位的计算机可以用补码表示-128
  6. win10光驱位连接计算机,windows10不能识别光驱位硬盘
  7. Skyscraper
  8. java问题的英语对话_一些表达拒绝的应用英语
  9. aac蓝牙编解码协议_最新的真无线蓝牙耳机选购指南
  10. 非常好的一篇对linux信号(signal)的解析