[C#.NET][WinForm] 如何使 控制項 不閃爍 /How to use double buffer for controls

[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

image

PropertyInfo info = this.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
info.SetValue(tableLayoutPanel1, true, null);

 

 

還沒設定前我們可以看到DoubleBuffered=false

image

設定後DoubleBuffered=true

image

 

範例如下:

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

 

若有謬誤,煩請告知,新手發帖請多包涵

2010~2017 C# 第四季