Извлечение фотографий из сети и последовательное их отображение - PullRequest
0 голосов
/ 25 ноября 2008
  1. Я хочу создать прокручиваемый список картинок, извлеченных из Интернета, и дать пользователю возможность щелкнуть по нему. Как мне сделать это в WinForms / C #? Можно ли добавить элемент управления Picturebox в listBox?

  2. Я попытался добавить список Picturebox в UserControl с AutoScroll, установленным в true, что даст мне ощущение, что я использую listBox. Это правильный подход?

  3. Я также попытался установить для параметра ImageLocation of pictureBox значение URI изображения, а затем вызвал Load () для загрузки изображения, это сработало, однако моя форма зависает! Как мне последовательно обновлять каждый блок рисунков, не замораживая форму?

Спасибо, Azlam

Ответы [ 2 ]

1 голос
/ 25 ноября 2008

Сначала я отвечу на ваш третий вопрос, потому что это единственный вопрос, на который я ДЕЙСТВИТЕЛЬНО знаю ответ. В графическом окне есть метод LoadAsync (), который загружает изображение в отдельном потоке и не вешает ваше приложение.

Что касается других вопросов, я бы, скорее всего, тоже начал с пользовательского элемента управления и поместил туда изображения. Единственное, что я могу предложить, - это сначала создать пользовательский элемент управления с графическим полем и, возможно, многострочным текстовым полем или текстовым полем рядом с ним. Выключите границу в текстовом поле и сделайте небольшую границу вокруг всего элемента управления. Это позволит вам отобразить изображение с текстом рядом с ним. Тогда ваш фактический конечный элемент управления будет просто набором этих элементов управления с возможностью добавлять их по мере необходимости.

- мои 2 цента ...

0 голосов
/ 27 декабря 2008

Вы не против прокрутки по вертикали?

Я бы начал с элемента управления 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) Отслеживать и использовать эмпирические данные из времени загрузки изображения, чтобы помочь определить, какие ячейки должны быть предварительно загружены.

...