Извлечение фотографий из сети и последовательное их отображение
-
11-07-2019 - |
Вопрос
Я хочу создать прокручиваемый список картинок, извлеченных из Интернета, и дать пользователю возможность щелкнуть по нему. Как мне сделать это в WinForms / C #? Можно ли добавить элемент управления Picturebox в listBox?
Я попытался добавить список Picturebox в UserControl с AutoScroll, установленным в значение true, что дает мне ощущение, будто я использую listBox. Это правильный подход?
Я также попытался установить для параметра ImageLocation pictureBox значение URI изображения, а затем вызвал Load () для загрузки изображения, это сработало, однако моя форма зависает! Как мне последовательно обновлять каждый блок рисунков, не замораживая форму?
Спасибо, Azlam
Решение
Сначала я отвечу на ваш третий вопрос, потому что это единственный вопрос, на который я ДЕЙСТВИТЕЛЬНО знаю ответ. В графическом окне есть метод LoadAsync (), который загружает изображение в отдельном потоке и не вешает ваше приложение.
Что касается других вопросов, я бы тоже, скорее всего, начал с пользовательского элемента управления и поместил туда изображения. Единственное, что я могу предложить, - это сначала создать пользовательский элемент управления с графическим полем и, возможно, многострочным текстовым полем или текстовым полем рядом с ним. Выключите границу в текстовом поле и сделайте небольшую границу вокруг всего элемента управления. Это позволит вам отобразить изображение с текстом рядом с ним. Тогда ваш фактический конечный элемент управления будет просто набором этих элементов управления с возможностью добавлять их по мере необходимости.
- мои 2 цента ...
Другие советы
Вы не против прокрутки по вертикали? Р>
Я бы начал с элемента управления 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) value.DisplayText, ...) для наложения текста в ячейке.
Это быстрое решение предоставит вам прокручиваемый список изображений, который загружает изображения только по мере того, как пользователь прокручивает список, и обеспечивает прочную основу для улучшения.
Рекомендуется дополнительная оптимизация:
A) Создайте растровое изображение и графику буферного буфера для рисования данных ячейки.
B) Настройте Paint (), чтобы просто закрасить буфер, а не выполнять работу по получению изображения.
C) Создайте новый метод ячейки LoadImage (), который порождает новый поток, который загружает изображение и рисует его в задний буфер.
D) Пусть Paint () (или отдельный вспомогательный поток) отслеживает направление и ускорение прокрутки и оценивает, какие ячейки необходимо предварительно загрузить. Запустите LoadImage () для этих ячеек.
E) Инициализировать задний буфер каждой ячейки загрузочным изображением.
F) Отслеживайте и используйте эмпирические данные из времени загрузки изображения, чтобы определить, какие ячейки необходимо предварительно загрузить.