[C#.NET][WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls
http://social.msdn.microsoft.com/Forums/zh-TW/233/thread/16f60c2f-93c2-4f8c-b987-4277fd992f7c
這是我自己碰到的一個問題,因為tableLayoutPanel在更新時狀態時會閃爍,設定Form.DoubleBuffered=true也沒有用
原來是要設定tableLayoutPanel.DoubleBuffered=true
不過DoubleBuffered是Protected 屬性,所以需要要使用反射來處理,請參考[C#.NET][VB.NET] 如何 列舉 類別中的成員 / Type.GetMembers
http://msdn.microsoft.com/zh-tw/library/system.windows.forms.tablelayoutpanel_properties.aspx
PropertyInfo info = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
info.SetValue(tableLayoutPanel1, true, null);
還沒設定前我們可以看到DoubleBuffered=false
範例如下:
PropertyInfo info = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
info.SetValue(tableLayoutPanel1, true, null);
同樣的我們也可以將此步驟套用到所有的控制項,為所有的控制項設定DoubleBuffered。
#region 建構子
private PropertyInfo _PropertyInfo = null;
public LaserMotion()
{
InitializeComponent();
this.DoubleBuffered = true;
this.SetStyle(
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.DoubleBuffer, true);
this._PropertyInfo = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
foreach (Control rootCtrl in this.Controls)
{
this._PropertyInfo.SetValue(rootCtrl, true, null);
if (rootCtrl.HasChildren)
SearchControl(rootCtrl);
}
}
#endregion
#region 遞迴
void SearchControl(Control Ctrl)
{
foreach (Control rootCtrl in Ctrl.Controls)
{
Debug.WriteLine(rootCtrl.Name + " 建立DoubleBuffer");
this._PropertyInfo.SetValue(rootCtrl, true, null);
if (rootCtrl.HasChildren)
SearchControl(rootCtrl);
else
break;
}
}
#endregion
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET