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