Извлечение фотографий из сети и последовательное их отображение

StackOverflow https://stackoverflow.com/questions/318368

Вопрос

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top