C# 如何避免.net中TableLayoutPanel中的闪烁

C# 如何避免.net中TableLayoutPanel中的闪烁,c#,winforms,tablelayoutpanel,C#,Winforms,Tablelayoutpanel,我使用TableLayoutPanel进行考勤。我在TableLayoutPanel中添加了控件(一个面板和一个标签),并为它们创建了事件。在某些情况下,我已清除所有控件,并继续在TableLayoutPanel的不同位置绑定相同的控件。重新绑定控件时,TableLayoutPanel会闪烁,初始化速度太慢。在添加所有控件之前,暂停布局 TableLayoutPanel panel = new TabelLayoutPanel(); panel.SuspendLayout(); // add

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

在添加所有控件之前,暂停布局

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

// add controls

panel.ResumeLayout();

还要看一下使用双缓冲。您必须创建TableLayoutPanel的子类。请看一个例子。

作为上述的改进,我在以下方面取得了更好的效果:

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

    // add controls

    panel.ResumePaint();
    panel.ResumeLayout();

使用此面板可将属性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; }
        }
}
公共部分类MyTableLayoutPanel:TableLayoutPanel
{
公共MyTableLayoutPanel()
{
初始化组件();
}
公共MyTableLayoutPanel(IContainer容器)
{
容器。添加(此);
初始化组件();
}
/// 
///双缓冲器
/// 
[说明(“双缓冲区”)]
[默认值(真)]
公共厕所
{
获取{返回this.DoubleBuffered;}
设置{this.DoubleBuffered=value;}
}
}
这对我来说非常有效

下面是链接中的内容(逐字复制)

完全消除由于TableLayoutPanel和Panel in引起的闪烁 windows窗体如下所示:=- 1.将双缓冲属性设置为Form=true。 2.在form.cs中粘贴以下两个函数

#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
  • 为每个
    TableLayoutPannel
    Pannel
    Splitcontainer
    Datagridview
    和所有容器调用
    SetDoubleBuffered(“TableLaoutPannel\u controlName”)
    控制
  • 感谢RhishikeshLathe于2014年2月16日下午20:11发布

    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#:


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

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


    它基本上等待Winform的完整渲染,并移除正在绘制到屏幕上的窗体的闪烁。如果你没有测试过,请不要忽视。我在winform延迟方面遇到了一个很大的问题,这就解决了这个问题。

    还有另一个选择,我最终使用了它,因为我的很多UI都使用透明作为背景色。我知道这会显著降低WINFORMS的性能。然而,WPF应用程序并非如此(通常不以闪烁的形式显示),因此转换可能是有益的

    //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);
            }
    

    //table layout panel控件的双缓冲解决方案非常有效,不会发生闪烁

    StopPaint
    ResumePaint
    不是TableLayout panel控件的本机方法。很明显,您使用的是一个扩展,您的答案中没有包含这个扩展。您能描述一下为什么dBuffer应该设置为true吗?这很有帮助,我现在得到的抖动要小得多。谢谢。在那里添加了一个报价栏。但是请注意,仅仅添加一个链接到另一篇文章并复制所有内容本身并不是一个正确的属性。如果除了链接中的详细信息之外,您没有其他需要添加的内容,那么最好将其作为评论。下次注意。这是如何回答问题的?将它添加到受影响课程的底部,我保证它会起作用。它基本上等待Winform的完整呈现。如果你没有测试过,请不要忽视。我在winform延迟方面遇到了一个大问题,这个问题得到了解决。这非常好地回答了这个问题,整个表单都解决了闪烁问题,谢谢这篇文章。
    //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);
            }