討論TableLayoutPanel載入緩慢和閃爍問題解決方案

soliang發表於2024-08-24

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原創內容點選開啟連結

相關文章