Вы не против прокрутки по вертикали?
Я бы начал с элемента управления DataGridView в качестве основы и создал бы следующую реализацию:
1) Создайте пользовательский столбец и тип ячейки, производные от DataGridViewImageColumn. Вы можете назвать их «CronosNetImageColumn», «CronosNetImageCell».
2) Создайте класс "CronosImageDetails" для хранения данных ячейки (включая свойства для отображаемого текста и URL-адреса изображения). Это будет передано как значение для каждой ячейки. Пример:
ImageGrid.Rows.Add (new CronosImageDetails {DisplayText = "День на пляже", ImageURL = "http: //...beach.jpg"});
3) Переопределите ячейку Paint (), чтобы использовать WebClient для получения изображения, и используйте e.Graphics.DrawImage (ImageObtainedFromWebClient) для рисования изображения в ячейке. Вы можете использовать значение e.Graphics.DrawString ((CronosImageDetails ).DisplayText, ...) для наложения текста в ячейке.
Это быстрое решение даст вам прокручиваемый список изображений, который загружает изображения только по мере того, как пользователь прокручивает список, и обеспечивает прочную основу для улучшения.
Рекомендуется дополнительная оптимизация:
A) Создайте растровое изображение и графику буферного буфера для рисования данных ячейки.
B) Настройте Paint (), чтобы просто закрасить буфер, а не выполнять работу по получению изображения
C) Создайте новый метод ячейки LoadImage (), который порождает новый поток, который загружает изображение и рисует его в задний буфер.
D) Попросите Paint () (или отдельную вспомогательную нить) отследить направление и ускорение прокрутки и оценить, какие ячейки необходимо предварительно загрузить. Запустите LoadImage () для этих ячеек.
E) Инициализировать задний буфер каждой ячейки с загрузочным изображением.
F) Отслеживать и использовать эмпирические данные из времени загрузки изображения, чтобы помочь определить, какие ячейки должны быть предварительно загружены.