C# 在WinC窗体中滚动时闪烁并弄乱flowLayoutPanel项#

C# 在WinC窗体中滚动时闪烁并弄乱flowLayoutPanel项#,c#,winforms,flicker,tablelayoutpanel,flowlayoutpanel,C#,Winforms,Flicker,Tablelayoutpanel,Flowlayoutpanel,我有一个flowLayoutPanel,其中包含一些项目。。这些项是我创建的自定义UserControl。 当我嘲笑时,这些物品会闪烁 因此,我创建了自定义FLP并将此代码放入其构造函数中: this.SetStyle( ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); 但它仍然在闪烁。。然后我在搜索后

我有一个flowLayoutPanel,其中包含一些项目。。这些项是我创建的自定义UserControl。 当我嘲笑时,这些物品会闪烁

因此,我创建了自定义FLP并将此代码放入其构造函数中:

this.SetStyle(
        ControlStyles.AllPaintingInWmPaint |
        ControlStyles.UserPaint |
        ControlStyles.DoubleBuffer, true);
但它仍然在闪烁。。然后我在搜索后找到了这段代码并添加了它:

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;
            return cp;
        }
    }
闪烁的问题解决了。。但此代码会导致滚动面板中出现一些性能问题。。速度变慢,用户体验不好:(


任何人都可以帮助解决此问题???

您也可以尝试以下方式:

this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
如果这还不够,可以使用以下方法手动停止并恢复窗体或控制图形:

[DllImport("user32.dll", EntryPoint = "SendMessageA", ExactSpelling = true, CharSet = 
CharSet.Ansi, SetLastError = true)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

private const int WM_SETREDRAW = 0xB;

public static void SuspendDrawing(Control target)
{
    if (target != null && !target.IsDisposed)
        SendMessage(target.Handle, WM_SETREDRAW, 0, 0);
}

public static void ResumeDrawing(Control target, bool redraw)
{
    if (target != null && !target.IsDisposed)
    {
        SendMessage(target.Handle, WM_SETREDRAW, 1, 0);

        if (redraw)
            target.Refresh();
    }
}

UserControl不应该有DoubleBuffer吗?它有..但没有做任何事情:)什么在闪烁?用户控制?更好地记录这一点。