Использую WPF, MVVM паттерн. На ряду с использованием метода Webclient.DownloadFileTaskAsync()
отдельным методом вынес и WebClient.CancelAsync()
, который тригерится нажатием кнопки. В том же метода идет передача вместе с изменением поля Label
в форме. Получилось так:
CancelDownloading = new DelegateCommand(() =>
{
MessageProgress = "Скачивание отмененно"; //Передача состояния в Label
_downloader.CancelDownload(); //Отмена асинхронной операции
});
И все ничего, но при тригере этого метода с помощью Button происходит только остановка загрузки. При повторном только нажатии изменяется поле Label. Поле, в которое передается MessageProgress обернуто в свойство:
private string messageProgress;
public string MessageProgress
{
get { return messageProgress; }
set { SetProperty(ref messageProgress, value); }
}
Почему изменение происходит только после повторного нажатия Button?
Update
Изначально упустил момент, что MessageProgress принимает значения из другого метода, который передает значение Webclient.DownloadProgressChange
. Тем не менее, в дебагере видно, что значение изменено, но в UI значение не обновилось, только остановился процесс загрузки (ProgressBar
в том числе).
Весь класс Downloader, отмена идет метода DownloadAllFiles
class Downloader:INotifyPropertyChanged
{
#region INPC progress
private int _progress;
public int counter = 1;
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChanged?.Invoke(this, e);
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public int Progress
{
get { return _progress; }
set
{
if (value != _progress)
{
_progress = value;
OnPropertyChanged("Progress");
}
}
}
#endregion
WebClient wc = new WebClient();
public async Task DownloadAllFiles(Dictionary<string, bool> context, string pathFile)
{
wc.DownloadProgressChanged += Download_Changing;
foreach (KeyValuePair<string, bool> pair in context)
{
string result = pair.Key.Substring(pair.Key.IndexOf("src/") + 14);
string fileName = pathFile + @"\" + result;
await wc.DownloadFileTaskAsync(pair.Key, fileName);
counter++;
}
wc.Dispose();
}
private void Download_Changing(object s, DownloadProgressChangedEventArgs e)
{
ProgrChanged(this, new ProgressEventArgs(e.ProgressPercentage));
}
public void CancelDownload()
{
wc.CancelAsync();
}
public event PropertyChangedEventHandler PropertyChanged;
public event EventHandler<ProgressEventArgs> ProgrChanged;
}
Какие существуют виды рекламных бордов и как выбрать подходящий?
Аренда удаленного сервера: цены, провайдеры и условия. Руководство для начинающих
Например есть поле и 2 кнопки, одна добавляет, каждый раз, после нажатия в поле число, а другая кнопка- убирает
Описание эмулятора здесьНо это какая-то волшебная страница
Подскажите как правильно сгенерировать приватный и закрытый ключ именно для RSA-2048
У некоторых программ я видел такую картину:есть само окно и внутри него еще одно окно, вот как на пример в программе Origin: Есть основное окно...