Обновление окна WPF C#

180
13 ноября 2019, 06:10

Только начал изучать wpf, так что не кидайте тапками:) У меня есть функция, которая создает новое окно с прогрессбаром, получает файлы по sftp (SSH.NET) и выводит прогресс получения этих файлов. Если сделать так:

foreach (var file in files)
            {
                if (!file.IsDirectory && !file.IsSymbolicLink)
                {
                    using (Stream fileStream = File.OpenWrite(System.IO.Path.Combine("photo_viewer_temp\\" + nowGetId.ToString(), file.Name)))
                    {
                        sftp.DownloadFile(file.FullName, fileStream);
                    }
                }
                nowDownloaded++;
                downloadProgressBar.Value = nowDownloaded;
                progressTextBlock.Text = nowDownloaded.ToString() + " из " + filesCounter.ToString();
            }

то окно просто "зависает". Программа загружает и сохраняет файлы, но окно не обновляется, windows показывает круглый курсор ("думает"). Но если сделать так:

foreach (var file in files)
            {
                if (!file.IsDirectory && !file.IsSymbolicLink)
                {
                    using (Stream fileStream = File.OpenWrite(System.IO.Path.Combine("photo_viewer_temp\\" + nowGetId.ToString(), file.Name)))
                    {
                        sftp.DownloadFile(file.FullName, fileStream);
                    }
                }
                nowDownloaded++;
                downloadProgressBar.Value = nowDownloaded;
                progressTextBlock.Text = nowDownloaded.ToString() + " из " + filesCounter.ToString();
                MessageBox.Show("Debug");
            }

То всё начинает работать. Как сделать так, чтобы оно обновлялось без MessageBox'а?

Answer 1

Вообще я бы порекомендовал для этого дела исследовать технологию MVVM, но есть простой способ сделать и без него, просто откладывать обновление данных на диспетчеру из задачи например:

Task.Run(() =>
{
    foreach (var file in files)
    {
        Dispatcher.CurrentDispacher.Invoke(() =>
        {
            if (!file.IsDirectory && !file.IsSymbolicLink)
            {
                using (Stream fileStream = File.OpenWrite(System.IO.Path.Combine("photo_viewer_temp\\" + nowGetId.ToString(), file.Name)))
                {
                    sftp.DownloadFile(file.FullName, fileStream);
                }
            }
            nowDownloaded++;
            downloadProgressBar.Value = nowDownloaded;
            progressTextBlock.Text = nowDownloaded.ToString() + " из " + filesCounter.ToString();
        });
    }
});
READ ALSO
Может быть это SQL инъекция

Может быть это SQL инъекция

Недавно нашел в логах запись, я не сильно разбираюсь в этомЭто может быть SQL инъекция ?

161
Форма контроля категорий

Форма контроля категорий

Я хочу реализовать добавление товара в категорииСейчас всё работает но я бы хотел видеть определённые несколько названий категорий а не все...

169