星期六, 11月 13, 2021

[C#] TreeView - 更新閃爍情形

遇上 TreeView 更新時發生閃爍 (Flicker) 情況,應用情境是把使用者權限總表用 TreeView 畫出,之後每位使用者把擁有權限的 TreeNode.Checked 打勾並 Hightlight 顯示,一開始想說有開啟 DoubleBuffer 也有使用 BeginUpdate()、EndUpdate() 來進行 TreeView 更新,查發現原來更新 TreeViewNode.Checked 和 Hightlight 時,並沒有使用到 BeginUpdate()、EndUpdate() 也才發現閃爍情況原來也有差異

Setting the DoubleBuffered property does not affect the TreeView control. If you want to reduce flicker when the TreeView is drawn, use the BeginUpdate and EndUpdate methods.

情況一:沒有應用上 BeginUpdate()、EndUpdate()

可以從下圖發現,TreeView 會一直閃爍且 ScrollBar 會上下跑

情況二:使用 BeginUpdate()、EndUpdate()

this.BeginUpdate();
// 填入 TreeNode.CheckBox 並 Highlight
this.EndUpdate();
可以從下圖發現,TreeView 只會閃一下

情況三:禁止清除背景訊息

protected override void WndProc(ref Message m)
{
	if (m.Msg ==  0x0014) // 禁止清除背景訊息,也可以查關鍵字 WM_ERASEBKGND
		return;

	base.WndProc(ref m);
}
可以從下圖發現,TreeView 就完全不會閃爍

沒有留言:

張貼留言