WinForm控件闪烁问题开启双缓冲
public class ControlDoubleBuffered
{
public static ControlDoubleBuffered Instance { get { return lazy.Value; } }
private static readonly Lazy<ControlDoubleBuffered> lazy = new Lazy<ControlDoubleBuffered>(() => new ControlDoubleBuffered());
/// <summary>
/// 控件双缓冲
/// </summary>
/// <param name="obj"></param>
public void DoubleBuffered(object obj)
{
if (obj is null)
return;
obj.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(obj, true, null);
}
}
或者 将此代码写在要解决闪烁问题的父窗体中:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000;
return cp;
}
}
或者
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
this.UpdateStyles();
以上都不能解决问题时
在调用自定义控件的窗体内添加:
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
在自定义控件中添加:
protected override CreateParams CreateParams
{
get
{
var parms = base.CreateParams;
parms.Style &= ~0x02000000; // Turn off WS_CLIPCHILDREN
return parms;
}
}