Задать вопрос
AlbertMolodec
@AlbertMolodec

Как асинхронно загружать изображения и отображать общий прогресс в Progress Bar'е?

Суть задания: написать WPF-приложение, умеющее подгружать картинки из интернета. Делать это нужно независимо от других картинок. Еще должна быть возможность загружать все вместе. Общий прогресс отображается на Progress Bar'е.
Скриншот спроектированного окна:
5a8d3e564b07b520911115.jpeg

У меня проблема с событиями и передачей в них параметров.
Я представляю себе, что должна быть одна функция, например, Downloading, которая принимает адрес изображения в интернете и рисует в соответствующем боксе эту картинку после загрузки. Нажатие одной из кнопок Start вызывает эту функцию со своим URL'ом и ImageBox'ом. Подсмотрел похожее в этом вопросе: Progress Bar & Thread в C#?

private void Downloading(string url) 
{ 
WebClient webload = new WebClient(); 

webload.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 
webload.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged); 
webload.DownloadFileAsync(new Uri(url), DataPath + Path.GetFileName(url)); 
}


Когда прописываю функцию Completed, хочу передать туда адрес фото на компьютере и номер ImageBox'а, куда рисовать изображение. Вот команды, которые рисуют:

ImageSourceConverter converter = new ImageSourceConverter(); 
ImageSource imageSource = (ImageSource)converter.ConvertFromString(DataPath + Path.GetFileName(url1)); 
ImageBox1.Source = imageSource;


Пока я работаю только с одной картинкой.
Я подозреваю, что передавать в Completed какие-то параметры не нужно и в принципе нельзя.

Может, написать новый класс для изображения, в котором хранить адрес в интернете, адрес на компьютере, номер бокса? Но проблема с передачей этого объекта все равно сохранится.
Еще я думал написать новую функцию, например, DrawImage и пусть она рисует. Но тогда я не знаю, как прописать условие в Downloading'е, чтобы отрисовка началась только после окончания загрузки.

Как мне поступить в этой ситуации?
  • Вопрос задан
  • 621 просмотр
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@Boodmoo
Читаем что такое MVVM и async/await, создаем UserControl с версткой типа
<Grid>
            <Image Source="{Binding Path=ViewModel.ImageSource, Mode=OneWay}"/>
            <ProgressBar Value="{Binding Path=ViewModel.DownloadProgres, Mode=OneWay}"/>
 </Grid>


Создаем ViewModel для контрола с нужными полями методом async Task Download().

теперь во ViewModel главного окна делаем метод принимающий массив Task, допустим startDownloadImage(params Task[] tasks) и выполняющий эти таски (await Task.WhenAll(tasks)).
В итоге получаем от каждой кнопки мы шлем таску от соответствующего UserControl`a, а если нужно все скачать то передаем все таски разом.

как то так, если не понятно то пиши
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы