11

我正在使用 TableLayoutPanel 进行考勤标记。我在这个 TableLayoutPanel 中添加了控件(一个面板和一个标签)并为它们创建了事件。在某些情况下,我已清除所有控件并继续在 TableLayoutPanel 的不同位置绑定相同的控件。重新绑定控件时,TableLayoutPanel 会闪烁并且初始化速度太慢。

4

7 回答 7

22

暂停布局,直到您添加了所有控件。

TableLayoutPanel panel = new TabelLayoutPanel();
panel.SuspendLayout();

// add controls

panel.ResumeLayout();

还要看看使用双缓冲。您必须创建 TableLayoutPanel 的子类。请参阅此处的示例。

于 2011-07-13T10:40:40.057 回答
10

这对我很有用删除由于 Windows 窗体中的 TableLayoutPanel 和面板而导致的闪烁

这是该链接中的内容(逐字复制)

完全消除由于 Windows 窗体中的 TableLayoutPanel 和面板导致的闪烁如下:=- 1. 设置窗体的双缓冲属性 =true。2.在form.cs中粘贴以下2个函数

#region .. Double Buffered function ..
   public static void SetDoubleBuffered(System.Windows.Forms.Control c)
    {
        if (System.Windows.Forms.SystemInformation.TerminalServerSession)
            return;
        System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered",
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance);
        aProp.SetValue(c, true, null);
    }

   #endregion


   #region .. code for Flucuring ..

   protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;
            return cp;
        }
    }

    #endregion
  1. 调用SetDoubleBuffered(“TableLaoutPannel_controlName”)每个TableLayoutPannel, Pannel, Splitcontainer, Datagridview& 所有容器控件。

感谢 RhishikeshLathe 于 2014 年 2 月 16 日下午 20:11 发布

于 2016-11-11T07:42:05.250 回答
7

VB.net:

   Protected Overrides ReadOnly Property CreateParams() As CreateParams
        Get
            Dim cp As CreateParams = MyBase.CreateParams
            cp.ExStyle = cp.ExStyle Or &H2000000
            Return cp
        End Get
    End Property

C#:

    protected override CreateParams CreateParams
    {
     get
     {
      CreateParams cp = base.CreateParams;
      cp.ExStyle = cp.ExStyle | 0x2000000;
      return cp;
     }
    }

在 VB 中将它添加到受影响类的底部,我向您保证它会起作用。

在 C# 中,将该属性与其他属性一起添加到类的顶部。

它基本上等待 Winform 的完整呈现,并消除正在绘制到屏幕上的表单的闪烁。如果您还没有测试它,请不要忽视。我在winform延迟方面遇到了一个大问题,这解决了它。

于 2019-04-25T13:35:05.030 回答
1

使用此面板将属性 dBuffer 设置为 true

public partial class MyTableLayoutPanel : TableLayoutPanel
{
        public MyTableLayoutPanel()
        {
            InitializeComponent();
        }

        public MyTableLayoutPanel(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        /// <summary>
        /// Double buffer
        /// </summary>
        [Description("Double buffer")]
        [DefaultValue(true)]
        public bool dBuffer
        {
            get { return this.DoubleBuffered; }
            set { this.DoubleBuffered = value; }
        }
}
于 2014-10-23T07:57:09.113 回答
1

我最终使用了另一种选择,因为我的很多 UI 都使用透明度作为背景颜色。我知道这会显着降低 WINFORMS 的性能。然而,这不是 WPF 应用程序的情况(通常不显示为闪烁),因此转换可能是有益的。

于 2019-07-16T11:54:24.910 回答
0
//Call this function on form load.
SetDoubleBuffered(tableLayoutPanel1);


public static void SetDoubleBuffered(System.Windows.Forms.Control c)
        {
            if (System.Windows.Forms.SystemInformation.TerminalServerSession)
                return;
            System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered",
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Instance);
            aProp.SetValue(c, true, null);
        }

//完美适用于表格布局面板的双缓冲解决方案,不会发生闪烁

于 2019-08-14T05:43:52.787 回答
-1

作为上述的改进,我得到了更好的结果:

    TableLayoutPanel panel = new TabelLayoutPanel();
    panel.SuspendLayout();
    panel.StopPaint();

    // add controls

    panel.ResumePaint();
    panel.ResumeLayout();
于 2013-10-18T13:11:42.233 回答