Intereting Posts

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

У меня есть меню, которое раньше было элементом управления TreeView, но теперь я хочу сделать каждый элемент более визуальным и добавить дополнительную информацию к каждому объекту в дереве.

Мое первое намерение состояло в том, чтобы сделать пользовательский элемент управления, представляющий элемент, и добавить его в панель во время выполнения. Это хороший подход? Иногда может быть более ста предметов. Я знаю, что существует максимальное количество элементов управления, которые вы теоретически можете иметь в форме, но это не моя основная проблема. Моя забота в основном о производительности.

Еще один подход, о котором я думал, – это сделать список и сделать дополнительный материал в методе onPaint. Но это кажется немного неустойчивым и слишком сложным для поддержания.

Какие-нибудь мысли?


РЕДАКТИРОВАТЬ:

Я протестировал usercontrol-подход, добавив 200 usercontrols в панель att form_Load, и для фактического добавления требуется довольно много времени, но, похоже, нет других проблем с производительностью. Скроллинг работает отлично, и я сделал каждый пользовательский контроль разворачиваемым, и это функциональное свойство никак не отстает, даже если на панели находится около ста и сотни под ним.

Но все же … Я вообще здесь?

UserControls являются очень «тяжелыми» животными, как и любой экземпляр System.Windows.Forms.Control, поскольку каждый из них обертывает фактическое базовое окно Win32. Каждому окну нужно управлять ОС, проверять, отправлять сообщения с краской и т. Д.

Традиционным решением для этого сценария в Windows является «виртуализация» элемента управления. Вместо создания 200 UserControls, поддерживайте массив из 200 «объектов», представляющих каждый элемент. Создайте один «большой» элемент управления, который представляет все меню, добавит к нему ScrollBar и переопределит OnPaint, рисуя только видимые элементы.

Это то, что использует старая школа, как ListBox и TreeView.

Теперь я считаю, что Windows может немного помочь вам в этом, в зависимости от того, как вам нужно. Ключевое слово, которое вы ищете, является «нарисованным владельцем». Крибис из другого ответа :

Подclass ListBox. В ctor установите режим рисования на OwnerDrawVariable и переопределите OnDrawItem и OnMeasureItem.

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