问题

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

WinForm-SuspendLayout、ResumeLayout、PerformLayout相关推荐

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

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

  2. WinForm-SuspendLayout、ResumeLayout、PerformLayou——转载

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

  3. 转WinForm-SuspendLayout、ResumeLayout、PerformLayou

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

  4. WinForm-SuspendLayout、ResumeLayout、PerformLayou

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

  5. ResumeLayout、SuspendLayout、PerformLayout

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

  6. suspendlayout,resumelayout,layout,performlayout【转】

    suspendlayout,resumelayout,layout,performlayout 1, 1.什么时候会触发control.layout事件? 当控件本身的大小(size)改变时会发生本控 ...

  7. WinForm绘制带有升序、降序的柱形图

    WinForm绘制带有升序.降序的柱形图 private void HuiZhiTu( string strPaiXu){//初始数据int[] nums = { 150, 89, 200, 60, ...

  8. winform取CPU编号、MAC地址、硬盘信息、IP地址、串口信息

    winform取CPU编号.MAC地址.硬盘信息.IP地址.串口信息 http://www.cnblogs.com/ccczqh/archive/2011/03/28/1997480.html 作者: ...

  9. WinForm绘制直线、曲线、矩形、椭圆、圆弧

    WinForm绘制直线.曲线.矩形.椭圆.圆弧 新建一个窗体.添加六个按钮,插入下面的代码.得到上图. private void button1_Click(object sender, EventA ...

最新文章

  1. 微信小程序自定义授权弹框
  2. java网络通信:异步非阻塞I/O (NIO)
  3. [Java基础]Lambda表达式的注意事项
  4. Java连接Elasticsearch6.xxx 代码高亮显示篇四
  5. CVPR 2019 神奇的超分辨率算法DPSR:应对图像模糊降质
  6. spikingjelly的20201221版本跑通ANN2SNN
  7. 公司的个性制度与团队精神
  8. 推荐系统/计算广告相关资料整理
  9. python plt调整子图间隔
  10. SpringBoot2.x填坑(二):elastic search 报错{error:{root_cause:[{type:index_not_found_exception,...
  11. Rust: codewars的DNA to RNA Conversion
  12. python必须要记住的代码_好用到哭!请记住这20段Python代码
  13. TMDB数据导入elasticsearch7
  14. CI框架精简版教程 最快上手
  15. IntelliJ Idea 向上/下插入空行快捷键
  16. wav音乐里面竟然有病毒?
  17. QDUOJ 93 - 分辣条(01背包)
  18. Parcel打包React
  19. 心率检测--异常可能
  20. java占位符填充_Java占位符

热门文章

  1. Git 版本管理工具(一)
  2. flash播放与html切换,html解决IE浏览器多个flash,来回切换,不能再次播放的问题...
  3. 24点游戏全解-1362组
  4. Pytorch CIFAR10图像分类 数据加载与可视化篇
  5. matlab figure 怎么用,Matlab:figure的用法
  6. Java小程序祝国庆快乐
  7. vue--vuex介绍与使用
  8. 城市文化笔记整理(一)
  9. Git reset(回滚) 和 revert(撤销)(图文详解)
  10. 一个贯穿图像处理与数据挖掘的永恒问题