Я установил диалог с несколькими вкладками. Один из них содержит двадцать полей со списком, каждый из которых содержит более 100 элементов, добавленных так:
foreach (var x in collection)
{
string text = FormatItem (x);
combo.Items.Add (text);
}
так что ничего особенного в предметах нет. Они представляют собой простые строки, и поля со списком заполняются при создании диалога. Это происходит почти мгновенно.
Однако, когда пользователь нажимает на вкладку, содержащую все эти поля со списком, в первый раз, графический интерфейс останавливается на несколько секунд (и я работаю на действительно мощной машине).
Я загрузил символы для System.Windows.Forms
и попытался взломать отладчик, пока программа зависла. Я обнаружил трассировку стека со следующими вызовами:
System.Windows.Forms.Control.CreateHandle()
System.Windows.Forms.ComboBox.CreateHandle()
System.Windows.Forms.Control.CreateControl(...) x 3
System.Windows.Forms.Control.SetVisibleCore(true)
System.Windows.Forms.TabPage.Visible.set(true)
, что приводит к множеству собственных переходов, WndProc
вызовов и т. Д. Я полагаю, это происходит для каждого элемента в каждом поле со списком. Уф.
Очевидно, я не могу оптимизировать WinForms. Но, может быть, я могу предпринять некоторые действия, чтобы избежать того, чтобы весь этот ад был потерян на моем плохом графическом интерфейсе? Есть идеи?
Примечание:
У меня нет комбо-обработчиков событий, которые могут быть вызваны, когда элементы управления создаются по-настоящему.
Если я попытаюсь получить доступ к свойству Handle
полей со списком сразу после создания и заполнения формы, я плачу штраф в этот момент, а не когда вкладка становится видимой в первый раз. Но не нужно также ждать несколько секунд при создании формы. Я действительно хочу избавиться от долгого времени наладки.
Идея применения BeginUpdate
и EndUpdate
здесь не применима: их следует использовать для предотвращения перекрашивания элемента управления при заполнении его списка элементов. Но в моем случае проблема возникает хорошо после того, как элемент управления был настроен.