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'е, чтобы отрисовка началась только после окончания загрузки.

Как мне поступить в этой ситуации?
  • Вопрос задан
  • 607 просмотров
Пригласить эксперта
Ответы на вопрос 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, а если нужно все скачать то передаем все таски разом.

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

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

Войти через центр авторизации
Похожие вопросы