2010-03-03 5 views
1

У меня есть список объектов UserControl; когда пункт меню нажать, чтобы перейти в другой раздел приложения он делает следующее:Как нарисовать элемент управления без рисования управления

  1. Установите Отображаемое UserControl в видимую
  2. Очистить список управления главной панели в
  3. Нового вверх запрашиваемое управление (если уже не создается в списке)
  4. Добавить новый элемент управления для управления списком основных панелей
  5. Dock новый элемент управления для заполнения
  6. Установите новый элемент управления для видимого

Я сделал это, потому что ранее все области приложения не были пользовательскими элементами управления, и они были всего лишь наборами элементов управления в TabControl. Основной код был чудовищным (код в frmMain был 13000+ строк).

Он хорошо работает. Все элементы управления (какими бы каждая закладка была раньше) управляли своим поведением, каждый элемент управления имеет небольшой размер кода. У меня может быть сексуальное меню. Все хорошие вещи.

Однако, очевидно, что есть проблема. Раньше tabcontrol загружался при запуске, и все вкладки отображали (но не видели). На одной странице табуляции, в частности, есть элемент управления планированием, и для рисования и настройки макета требуется 3-4 секунды. Теперь, когда элементы управления загружаются и отображаются по мере необходимости, при первом просмотре этого конкретного элемента управления вы видите его загрузку и настройку его размера/форматирования/и т. Д. Это вряд ли эстетично.

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

Я пробовал простые вещи, как:

ScheduleWindow scheduler = new ScheduleWindow() { Visible = false; } 
mainPanel.Controls.Add(scheduler); 
scheduler.Visible = true; 

Я попытался создать и загрузить элемент управления на своем собственном потоке (с многочисленными трудностями), и он до сих пор ничего не делать ...

Есть ли способ достичь того, что я ищу?

ответ

3

Пробуйте использовать методы SuspendLayout() и ResumeLayout() на основной форме? Когда вы вызываете SuspendLayout(), вы можете делать все, что вам нужно, с помощью элементов управления, которые вы добавляете, таких как стыковка, изменение размера и т. Д. Когда вы вызываете ResumeLayout(), все изменения будут применены сразу и должны произойти мгновенно.

В качестве альтернативы, некоторые элементы управления имеют метод BeginUpdate() и EndUpdate(), который приостанавливает перерисовку для этого элемента управления, что позволяет выполнять тяжелую работу (например, добавлять тысячи элементов в ListView), не видя, что обновления происходят в реальном времени. Это также улучшает производительность, а не перерисовывает каждый раз, когда элемент управления изменяется, вы меняете пакет, а затем перерисовываете один раз.

+0

Молодцы. Спасибо! –

0

Попробуйте позвонить scheduler.Handle.ToString() и/или scheduler.Refresh().