Как нарисовать элемент управления, не рисуя элемент управления - PullRequest
1 голос
/ 03 марта 2010

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

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

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

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

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

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

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 03 марта 2010

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

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

0 голосов
/ 03 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...