Я пытаюсь создать вид элемента управления ImageListBox
, который будет отображать большое количество миниатюр, например, тот, который используется в Picasa.
Это мой дизайн:
У меня есть FlowLayoutPanel
, который заполнен большим количеством UserControl
объектов, например, 4000.
Каждому UserControl
назначается делегат на событие Paint
.
Когда вызывается событие Paint
, оно проверяет миниатюру в кэш-памяти и, если изображение отсутствует в кэше, извлекает его с диска.
У меня есть две проблемы, которые я пытаюсь решить:
Похоже, что WinForms вызовет событие Paint
, даже если UserControl
не отображается. Фактически видно только 10 или около того элементов управления, остальные - нет (FlowLayoutPanel.AutoScroll
установлен на true
). В результате он пытается получить эскизы для всех изображений, и это занимает много времени.
Добавление UserControl
объектов в FlowLayoutPanel
занимает несколько длительное время, около 2-3 секунд. Я могу жить с этим, но мне интересно, есть ли лучший способ сделать это, чем:
UserControl[] boxes = new UserControl[N];
// populate array
panel.SuspendLayout();
panel.Controls.AddRange(boxes);
panel.ResumeLayout();