微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何避免winforms中渐变面板的闪烁?

如何解决如何避免winforms中渐变面板的闪烁?

我设计了一个类似 winform 的仪表板,当我尝试调整 winform 的大小时,它闪烁太多。

我已经尝试过 SuspendLayout 并启用了 DoubleBufferring,但问题仍然存在。请检查以下 GIF。

WinForm flickring While Resizing GIF

编辑

这是渐变面板的代码

 this.bunifuGradientPanel1.BackColor = System.Drawing.Color.Transparent;
            this.bunifuGradientPanel1.BackgroundImage = ((System.Drawing.Image)(resources.Getobject("bunifuGradientPanel1.BackgroundImage")));
            this.bunifuGradientPanel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
            this.bunifuGradientPanel1.Controls.Add(this.panel1);
            this.bunifuGradientPanel1.Controls.Add(this.panel4);
            this.bunifuGradientPanel1.Controls.Add(this.panel3);
            this.bunifuGradientPanel1.Controls.Add(this.panel5);
            this.bunifuGradientPanel1.Controls.Add(this.panel6);
            this.bunifuGradientPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.bunifuGradientPanel1.GradientBottomLeft = System.Drawing.Color.FromArgb(((int)(((byte)(255)))),((int)(((byte)(128)))),((int)(((byte)(0)))));
            this.bunifuGradientPanel1.GradientBottomright = System.Drawing.Color.FromArgb(((int)(((byte)(192)))),((int)(((byte)(0)))),((int)(((byte)(192)))));
            this.bunifuGradientPanel1.GradientTopLeft = System.Drawing.Color.Purple;
            this.bunifuGradientPanel1.GradientTopRight = System.Drawing.Color.FromArgb(((int)(((byte)(255)))),((int)(((byte)(192)))),((int)(((byte)(128)))));
            this.bunifuGradientPanel1.Location = new System.Drawing.Point(0,0);
            this.bunifuGradientPanel1.Name = "bunifuGradientPanel1";
            this.bunifuGradientPanel1.Quality = 10;
            this.bunifuGradientPanel1.Size = new System.Drawing.Size(1020,680);
            this.bunifuGradientPanel1.TabIndex = 0;

提前感谢您的帮助。

解决方法

终于解决了这个问题!

以下是正确答案,以防将来有人遇到此问题:

首先,在 Form.cs 中创建以下函数:

//Double Buffering Function
        public static void SetDoubleBuffering(System.Windows.Forms.Control control,bool value)
        {
            System.Reflection.PropertyInfo controlProperty = typeof(System.Windows.Forms.Control)
                .GetProperty("DoubleBuffered",System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            controlProperty.SetValue(control,value,null);
        }

然后只需调用 Form1_Load 函数中的函数并传递控件的名称(在我的示例中为面板“bunifuGradientPanel1”),您就可以开始了:

 private void Form1_Load(object sender,EventArgs e)
        {
            // Enabling Double Buffering for BunifuGradientPanel
            SetDoubleBuffering(bunifuGradientPanel1,true);
        }

希望这可以帮助任何人在使用 Windows 窗体 c# 中的面板时遇到闪烁问题。

感谢 Fluxbytes.com 创建上述功能并将其发布在他们的论坛上。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。