不闪的 才是健康的 —— 让 Winform 控件不再闪烁

俗话说「不闪的,才是健康的」。做 Winform 应用的时候经常会用到 ListView 控件,而如果频繁更新 ListView 中的内容则会一闪一闪的非常不舒服,用户体验极差。其实解决这个问题也很简单,下面提供两套方案,适用于不同情况。

1. 自定义 ListView 控件

如果项目中有多处地方用到 ListView,那我们可以自定义一个 ListView 并重写其中的样式行为方法,让其使用双缓冲模式,减少控件重绘就行。

public class ListViewFlickerless : ListView
{
    public ListViewFlickerless()
    {
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.EnableNotifyMessage, true);
    }
    
    protected override void OnNotifyMessage(Message m)
    {
        if (m.Msg != 0x14) base.OnNotifyMessage(m);
    }
}

2. 扩展控件

另一种方案,是为所有控件提供一个开启双缓冲的扩展方法,那除了 ListView 其它控件也可以享受不闪烁的频繁刷新啦。

public static class ControlExtensions
{
    public static void DoubleBuffering(this Control control, bool enable)
    {
        control.GetType()
            .GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic)
            .SetValue(control, enable, null);
    }
}

如此一来,需要打开不闪特效的时候,只要调用一下 .DoubleBuffering(true) 就可以啦,更自由更方便。

上一篇: Kaweco AL Sport

下一篇: 好日子