UserControls - очень «тяжелые» животные, как и любой экземпляр System.Windows.Forms.Control, поскольку каждый из них оборачивает фактическое базовое собственное окно Win32. Каждое окно должно управляться операционной системой, проверяться на попадание, отправляться сообщения рисования и т. Д.
Традиционным решением для этого сценария в Windows является «виртуализация» элемента управления. Вместо создания 200 пользовательских элементов управления следует поддерживать массив из 200 «объектов», представляющих каждый элемент. Создайте один «большой» элемент управления, представляющий все меню, добавьте к нему ScrollBar и переопределите OnPaint, рисуя только видимые элементы.
Это то, что делают нативные элементы управления старой школы, такие как ListBox и TreeView.
Теперь я верю, что Windows может немного вам здесь помочь, в зависимости от того, насколько вам нужно. Ключевое слово, которое вы ищете, является "нарисованным владельцем". Крики от другой ответ :
Подкласс ListBox. В ctor установите режим рисования на OwnerDrawVariable и переопределите OnDrawItem и OnMeasureItem.
Таким образом, встроенные элементы управления будут обрабатывать всю прокрутку и математику, необходимые для выяснения того, где вы находитесь в списке и с чего начать рисование.