惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
Netflix TechBlog - Medium
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
雷峰网
雷峰网
宝玉的分享
宝玉的分享
IT之家
IT之家
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Jina AI
Jina AI
博客园 - 叶小钗
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
云风的 BLOG
云风的 BLOG
美团技术团队
爱范儿
爱范儿
T
The Blog of Author Tim Ferriss
L
LangChain Blog
U
Unit 42
有赞技术团队
有赞技术团队
博客园_首页

博客园 - vidorlee

GitHub退款申请经验分享 C# 如何避免在基类中实现所有接口同时也不让每个子类重复实现 CoreXY运动结构工作原理 最佳的实现Winfrom无边框四周阴影方案 在VS2022上安装pygame模块 漫谈Winform控件优化之圆角矩形边框处理 C#中设置自定义控件工具箱图标 关闭Windows 10自动更新的方法 MVVM模式开发WinForm-ReactiveUI C#单例模式的用途 TensorFlow基本使用教程 C#自定义事件的写法 C#多线程Task创建 PropertyChanged.Fody自动通知属性插件 5、Pico Robot 机器人课程 4、Pico Robot 传感器进阶课程 3、Pico Robot 基础开发课程 2、Pico Robot 开发环境搭建 1、Pico Robot 智能小车平台介绍
讨论TableLayoutPanel加载缓慢和闪烁问题解决方案
vidorlee · 2024-08-24 · via 博客园 - vidorlee

WinForm加载多个自定义控件时,会出现很严重的闪烁问题,很卡,一块一块的加载(像打开网页时,网络很卡的那种感觉)简直没法忍受。

在网上搜索了好久,网上大部分的方法是一下4种,但是都不能有效的解决问题。

1、将DoubleBuffered 设置 true,用双缓存处理Form界面内容加载,可以提高页面显示质量。

1 public MyUserControl
2 {
3 SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
4 
5 this.UpdateStyles();
6 }

2、把构造方法里的内容尽量移动到Form_load事件里处理。

3、把控件绘制的Paint()写到一起绘制。

4、在控件使用后有变化时可以采用先 挂起 再显示的方法,提高显示质量。

 1 this.tableLayoutPanel2.SuspendLayout();
 2  
 3 this.SuspendLayout();
 4  
 5 tableLayoutPanel2.Controls.Clear();
 6   
 7 tableLayoutPanel2.ColumnCount = value.ColumnCount;
 8  
 9 tableLayoutPanel2.ColumnStyles.Clear();
10  
11 for (int i = 0; i < this.tableLayoutPanel2.ColumnCount; i++) { 
12     this.tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F/this.tableLayoutPanel2.ColumnCount));
13 }
14  
15 this.tableLayoutPanel2.RowCount = value.ReservedCount / value.ColumnCount;
16  
17 tableLayoutPanel2.RowStyles.Clear();
18  
19 for (int i = 0; i < tableLayoutPanel2.RowCount; i++) { 
20     this.tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F/tableLayoutPanel2.RowCount));
21  
22 }
23  
24 // 动态添加控件
25  
26 // 在这儿添加你的代码 
27 //...
28  
29  
30 tableLayoutPanel2.ResumeLayout(true);
31  
32 this.ResumeLayout(true);

以上这几种办法,相信大家只要试了,你就会发现并不能解决问题! 

真正有效的解决办法:

1、在调用自定义控件的窗体内添加:

1 protected override CreateParams CreateParams 
2 { 
3    get 
4    { 
5             CreateParams cp = base.CreateParams; 
6             cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED 
7             return cp; 
8    } 
9 }

2、在自定义控件中添加:

1 protected override CreateParams CreateParams 
2 { 
3     get 
4     { 
5         var parms = base.CreateParams; 
6         parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN 
7         return parms;
8     } 
9 }

本文转载自k_set原创内容点击打开链接