none
如何使tableLayoutPanel不閃爍 RRS feed

  • 問題

  • Dear All
    小弟使用了一個tableLayoutPanel,裡面擺了pictureBox、textBox,如下圖
    http://files.dotblogs.com.tw/yc421206/1010/20101019163116256.png

    我用System.Timers.Timer,來更新pictureBox、textBox的狀態,當我有設定tableLayoutPanel.CellBorderStyle時,

    tableLayoutPanel會閃爍,當tableLayoutPanel.CellBorderStyle=TableLayoutPanelCellBorderStyle.None則不會閃爍。

    當然使用tableLayoutPanel1.SuspendLayout/tableLayoutPanel1.ResumeLayout()就不會閃爍,但也無法自動變更大小了。

    問了Bill叔得知可能是DoubleBuffer的問題,為此問題我特定上了google查詢得到了幾種測試方式,但仍無法解決我的問題
    1.設定DoubleBuffer
                this.DoubleBuffered = true;
                this.SetStyle(
                            ControlStyles.UserPaint |
                            ControlStyles.AllPaintingInWmPaint |
                            ControlStyles.DoubleBuffer, true);

    2.參考網址的做法定義DoubleBuffer,
    http://www.bobpowell.net/doublebuffer.htm

    請問我該如何解決此問題呢?
    秘訣無它,唯勤而已
    2010年10月19日 上午 08:54

解答

  • 若改成設定TableLayoutPanel的DoubleBuffered屬性呢

    private void Form1_Load(object sender, EventArgs e)
    {
      tableLayoutPanel1.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(tableLayoutPanel1, true, null);
    }
    
    • 已標示為解答 余小章MVP 2010年10月20日 上午 02:46
    2010年10月20日 上午 01:17

所有回覆

  • 若改成設定TableLayoutPanel的DoubleBuffered屬性呢

    private void Form1_Load(object sender, EventArgs e)
    {
      tableLayoutPanel1.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(tableLayoutPanel1, true, null);
    }
    
    • 已標示為解答 余小章MVP 2010年10月20日 上午 02:46
    2010年10月20日 上午 01:17
  • 若改成設定TableLayoutPanel的DoubleBuffered屬性呢

    private
     void
     Form1_Load(object
     sender, EventArgs e)
    {
     tableLayoutPanel1.GetType().GetProperty("DoubleBuffered"
    , System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(tableLayoutPanel1, true
    , null
    );
    }
    
    


    原來是用反射處理Protected的 DoubleBuffered屬性,謝謝Alex

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.tablelayoutpanel_properties.aspx
    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.control.doublebuffered.aspx

     


    秘訣無它,唯勤而已
    2010年10月20日 上午 02:46