Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Как отобразить прогресс выполнения


Автор: Асоишница 13.11.2014, 23:25
Программа удаляет файлы без возможности восстановления специализированным ПО.
При запуске приложения выскакивает окошко, которое предлагает выбрать метод удаления(combobox), добавить файлы или папки и собственно нажать кнопку "Удалить". По нажатию этой кнопки должно выскочить окошко с отображением прогресса выполнения (что сейчас удаляется, сколько из скольки удалено и зелёная полоса выполнения для наглядности), которое по окончанию выдаст информацию: сколько удалено, сколько нет, сколько затрачено времени, а по нажатию ОК перейдёт опять на главное окно.
Собственно вопрос как организовать это окно прогресса.
Из главного окна при создании окна прогресса передаются параметры: имя метода из combobox.Text, количество элементов для удаления (файлы+папки), собственно сам список List и номер метода из combobox(надо для выбора метода удаления))
Методы удаления прописаны в отдельном модуле и просто вызываются в нужном месте прогресса(отдельно для файла и папки).
Скажите куда копать и очень желательно толковый пример на эту тему... smile
С# не знаю, но нужно GUI-приложение, так что выбор пал на Visual Studio 2013 и собственно WPF

Автор: Ilya81 14.11.2014, 13:37
Информацию о самом ходе удаления всё равно может знать только модуль, его осуществляющий - последовательность вызовов метода, события и т. п.. А в самом WPF просто - ставите соответствующие control'ы (TextBlock, ProgressBar и прочие) и (в случае MVVM) обновляете свойства, на которые binding'и с вызовом события PropertyChanged, не забывая при необходимости вызвать Dispatcher.Invoke (или BeginInvoke, в зависимости от особенностей модуля удаления).

Автор: Uvs 8.12.2014, 10:58
Если не ошибаюсь, эта методика - называется call-back вызовы, которая реализуется с помощью обработчиков событий.

Вот, ваш код(class), или область программы, которая выполняет безвозвратное удаление данных.

public class <Удаление>
{
public <имя метода>
  {
    выполнение процесса удаления
  }            
}

Но, класс, выполняющий эти действия - понятия не имеет о прогрессе отображения операций(да и не должен, по логике. У него своя определенная задача). Если, в этот класс передать ссылку какого-нибудь компонента, подобного progressbar - то логически это будет не правильно, т.к. жесткая связность модулей - всегда ухудшает качество. И самый лучший способ, на мой взгляд это добавить в класс обработчик события. Получится вот такая конструкция:

public class <Удаление>
{
public event EventHandler<EventArgs> OnDelete;
public <имя метода>
  {
    выполнение процесса удаления;
        
    любой цикл for/foreach или какой-то другой
    {
    // проверка, инициализ-на ли ссылка обработчика событий
    if(OnDelete != null) OnDelete();

    }        
  }            
}

При создании класса <Удаление> в программе - на ссылку OnDelete "вешается" процедура, выполняющая отображение прогресса.

<Удаление> dlt = new <Удаление>();
dlt.OnDelete += OneStep;
..................................

public void OneStep()
{
тут меняется прогресс бар(или ресторан smile)
}

Вот, вроде и всё. Надеюсь, это облегчит решение задачи.

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-otobrazit-progress-vypolneniya-id5465141cae2015fc388b4567#findElement_E7045_54855a3aae2015fd7433d213_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)