Winforms Подождите, пока не будут добавлены элементы управления

StackOverflow https://stackoverflow.com/questions/2073751

  •  20-09-2019
  •  | 
  •  

Вопрос

Возможный дубликат:
Как приостановить рисование элемента управления и его дочерних элементов?

Я добавляю в форму пару сотен элементов управления, и форма мерцает, пока не будет готово, пока добавляется каждый элемент управления. Можно ли как-нибудь остановить это?

Это было полезно?

Решение

Ответ такой же, как и ответ на этот вопрос:

Как приостановить рисование элемента управления и его дочерних элементов?

(Ответ скопирован для удобства:первоначально из: https://stackoverflow.com/users/36860/ng5000)

На моей предыдущей работе нам было трудно заставить наше приложение с богатым пользовательским интерфейсом рисовать мгновенно и плавно.Мы использовали стандартные элементы управления .Net, пользовательские элементы управления и элементы управления devexpress.

После долгих поисков в Google и использования отражателя я наткнулся на сообщение WM_SETREDRAW win32.Это действительно останавливает рисование элементов управления, пока вы их обновляете, и может быть применено IIRC к родительской/содержащей панели.

Это очень простой класс, демонстрирующий, как использовать это сообщение:

class DrawingControl
{
    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam);

    private const int WM_SETREDRAW = 11; 

    public static void SuspendDrawing( Control parent )
    {
        SendMessage(parent.Handle, WM_SETREDRAW, false, 0);
    }

    public static void ResumeDrawing( Control parent )
    {
        SendMessage(parent.Handle, WM_SETREDRAW, true, 0);
        parent.Refresh();
    }
}

По этому поводу есть более полные обсуждения - Google для C # и WM_SETREDRAW, например.

С# джиттер

Приостановка макетов

Другие советы

возможно, вы захотите окружить свой код свойствами SuspendLayout и ResumeLayout формы.

это.SuspendLayout();

//создаем элементы управления

this.ResumeLayout(истина);

Ниже показано то же решение ng5000, но без использования P/Invoke.

public static class SuspendUpdate
{
    private const int WM_SETREDRAW = 0x000B;

    public static void Suspend(Control control)
    {
        Message msgSuspendUpdate = Message.Create(control.Handle, WM_SETREDRAW, IntPtr.Zero,
            IntPtr.Zero);

        NativeWindow window = NativeWindow.FromHandle(control.Handle);
        window.DefWndProc(ref msgSuspendUpdate);
    }

    public static void Resume(Control control)
    {
        // Create a C "true" boolean as an IntPtr
        IntPtr wparam = new IntPtr(1);
        Message msgResumeUpdate = Message.Create(control.Handle, WM_SETREDRAW, wparam,
            IntPtr.Zero);

        NativeWindow window = NativeWindow.FromHandle(control.Handle);
        window.DefWndProc(ref msgResumeUpdate);

        control.Invalidate();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top