C# tableLayoutPanel動態載入控制元件閃爍的解決方案
阿新 • • 發佈:2019-01-09
本文轉載自k_set原創內容點選開啟連結
WinForm載入多個自定義控制元件時,會出現很嚴重的閃爍問題,很卡,一塊一塊的載入(像開啟網頁時,網路很卡的那種感覺)簡直沒法忍受。
在網上搜索了好久,網上大部分的方法是一下4種,但是都不能有效的解決問題。
1.將DoubleBuffered 設定 true,用雙快取處理Form介面內容載入,可以提高頁面顯示質量。或者
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); this.UpdateStyles();
2.把構造方法裡的內容儘量移動到Form_load事件裡處理。
3.把控制元件繪製的Pint()寫到一起繪製。
4.在控制元件使用後有變化時可以採用先 掛起 再顯示的方法,提高顯示質量。
this.tableLayoutPanel2.SuspendLayout(); this.SuspendLayout(); tableLayoutPanel2.Controls.Clear(); tableLayoutPanel2.ColumnCount = value.ColumnCount; tableLayoutPanel2.ColumnStyles.Clear(); for (int i = 0; i < this.tableLayoutPanel2.ColumnCount; i++) { this.tableLayoutPanel2.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F/this.tableLayoutPanel2.ColumnCount)); } this.tableLayoutPanel2.RowCount = value.ReservedCount / value.ColumnCount; tableLayoutPanel2.RowStyles.Clear(); for (int i = 0; i < tableLayoutPanel2.RowCount; i++) { this.tableLayoutPanel2.RowStyles.Add(new RowStyle(SizeType.Percent, 100F/tableLayoutPanel2.RowCount)); } // 動態新增控制元件 // 在這兒新增你的程式碼 ... tableLayoutPanel2.ResumeLayout(true); this.ResumeLayout(true);
你只有試了你就會發現,以上這幾種辦法並不能解決問題。
解決辦法:
在呼叫自定義控制元件的窗體內新增的:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
在自定義控制元件中新增的:
protected override CreateParams CreateParams { get { var parms = base.CreateParams; parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN return parms; } }