Мерцание и путаница элементов flowLayoutPanel при прокрутке в winform С#

У меня есть flowLayoutPanel, в котором есть некоторые элементы... эти элементы являются пользовательским пользовательским элементом управления, который я создал. Когда я scorll , эти элементы мерцают.

Итак, я создал собственный FLP и поместил этот код в его конструктор:

this.SetStyle(
        ControlStyles.AllPaintingInWmPaint |
        ControlStyles.UserPaint |
        ControlStyles.DoubleBuffer, true);

Но он все еще мерцает.. затем я после некоторого поиска нашел этот код и добавил его:

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;
            return cp;
        }
    }

проблема с мерцанием решена.. но этот код вызывает некоторые проблемы с производительностью на панели прокрутки.. он работает медленно и имеет плохой UX :(

кто может помочь с этой проблемой??


person S.L.javad    schedule 19.01.2020    source источник
comment
Разве UserControl не должен иметь DoubleBuffer?   -  person LarsTech    schedule 19.01.2020
comment
это было .. но ничего не сделал :)   -  person S.L.javad    schedule 19.01.2020
comment
Что мерцает? Пользовательский контроль? Документируйте это лучше.   -  person LarsTech    schedule 19.01.2020


Ответы (1)


Вы также можете попробовать этот стиль:

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();
    }
}
person Bioukh    schedule 31.03.2020