如何避免winforms中渐变面板的闪烁?
How can I avoid the flickering of gradient panel in 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 Forms c# 中使用面板时遇到闪烁问题的任何人有所帮助。
感谢 Fluxbytes.com 创建上述功能并将其发布在他们的论坛上。
我设计了一个类似 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 Forms c# 中使用面板时遇到闪烁问题的任何人有所帮助。
感谢 Fluxbytes.com 创建上述功能并将其发布在他们的论坛上。