Winforms Подождите, пока не будут добавлены элементы управления
Вопрос
Возможный дубликат:
Как приостановить рисование элемента управления и его дочерних элементов?
Я добавляю в форму пару сотен элементов управления, и форма мерцает, пока не будет готово, пока добавляется каждый элемент управления. Можно ли как-нибудь остановить это?
Решение
Ответ такой же, как и ответ на этот вопрос:
Как приостановить рисование элемента управления и его дочерних элементов?
(Ответ скопирован для удобства:первоначально из: 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();
}
}