Хобрук: Ваш путь к мастерству в программировании

Индикатор выполнения переходит от 0% до 100% без обновления между ними.

Я реализую ProgressBar, который обновляется после каждой завершенной задачи (всего 5 задач). Он должен обновляться на 20% после каждой завершенной задачи. Нажатие кнопки запускает выполнение задач, но при нажатии индикатор выполнения изменяется от 0% до 100% без обновления между ними. Thread.Sleep (1000) был добавлен перед каждым приращением значения прогресса, чтобы имитировать время, которое займет каждая задача. Я хочу, чтобы индикатор выполнения работал перед добавлением кода для каждой задачи.

Я пробовал добавить событие AvaloniaPropertyChanged, но, похоже, это не решает проблему.

MainWindow.xaml:

<ProgressBar Name="RunProgress" Value="{Binding Progress}" IsIndeterminate="False" Minimum="0" Maximum="100" Height="30"/>
<TextBlock Text="{Binding ElementName=RunProgress, Path=Value, StringFormat={}{0:0}%}" HorizontalAlignment="Center" VerticalAlignment="Center" />

MainWindow.xaml.cs:

//boolean variables for whether or not that process is completed (false if not done, true if done)
bool MasterLimitsRead = false;
bool MasterOrganized = false;
bool LimitsOrganized = false;
bool RemovedFailed = false;
bool OutputCreated = false;

//holds descriptions of the 5(+1) operations the program runs through including description for Done
string[] operation =
{
   "Reading the master and limits file text",
   "Organizing the master data",
   "Organizing the limits",
   "Identifying and removing failed devices",
   "Creating the output",
   "Done"
};

context.CurrentOp = operation[0];

Thread.Sleep(1000);
MasterLimitsRead = true;
if(MasterLimitsRead == true)
{
   context.Progress += 20;
   context.CurrentOp = operation[1];
}

Thread.Sleep(1000);
MasterOrganized = true;
if(MasterOrganized == true)
{
   context.Progress += 20;
   context.CurrentOp = operation[2];
}

Thread.Sleep(1000);
LimitsOrganized = true;
if(LimitsOrganized == true)
{
   context.Progress += 20;
   context.CurrentOp = operation[3];
}

Thread.Sleep(1000);
RemovedFailed = true;
if(RemovedFailed == true)
{
   context.Progress += 20;
   context.CurrentOp = operation[4];
}

Thread.Sleep(1000);
OutputCreated= true;
if(OutputCreated== true)
{
   context.Progress += 20;
   context.CurrentOp = operation[5];
}

MainWindowViewModel.cs:

private string currentOp = string.Empty;   //variable to store current operation, initialized to empty string
public string CurrentOp
{
   get => currentOp;
   set
   {
      if (value != currentOp)
      {
         currentOp = value;
         OnPropertyChanged();
      }
    }
}

private string progress = 0;   //variable to store ProgressBar value in percent, initialized to 0
public string CurrentOp
{
   get => currentOp;
   set
   {
      if (value != currentOp)
      {
         currentOp = value;
         OnPropertyChanged();
      }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
   if(PropertyChanged != null)
   {
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
   }
}

Ожидается: индикатор выполнения должен увеличиваться с 0% до 100% на 20% после завершения каждой задачи (имитируется 1-секундной задержкой Thread.Sleep (1000))

Фактически: индикатор выполнения начинается с 0%, затем при нажатии кнопки останавливает взаимодействие с пользовательским интерфейсом на 5 секунд, затем обновляет индикатор выполнения до 100%. Я хочу, чтобы он обновлялся при каждом увеличении значения индикатора выполнения.


Ответы:


1

Вызывая Sleep, вы блокируете поток пользовательского интерфейса. Если поток пользовательского интерфейса заблокирован, обновлений пользовательского интерфейса не будет. Вместо этого для имитации длительных задач используйте await Task.Delay(TimeSpan.FromSeconds(1)).

25.06.2019
Новые материалы

Управление DOM для чайников вроде меня
Одной из первых вещей, которую мы рассмотрели, когда начали изучать Javascript во Flatiron, была модель DOM. Кто он? Чем он занимается? Он больше машина, чем человек? Ну да довольно много. ДОМ..

Что такое структура данных?
Структура данных хранит и извлекает данные. Все, что обеспечивает эти две функции, является структурой данных . Период. Вы можете пропустить оставшуюся часть статьи, если ответ..

мои январские чтения по программированию
Эрик Эллиот Программирование приложения JavaScript Эл Свейгарт «Автоматизируйте скучные вещи с помощью Python» Прогрессивное веб-приложение Google..

Создание ассоциаций секвелизации с помощью инструмента командной строки Sequelize
Sequelize - популярный, простой в использовании инструмент объектно-реляционного сопоставления (ORM) JavaScript, который работает с базами данных SQL. Довольно просто начать новый проект с..

Искусственный интеллект в юридической отрасли - пример прогнозирования судебных решений с помощью глубокого обучения
На протяжении всей истории люди полагались на суды, присяжных, королей и королев в отправлении правосудия. Сегодня способность судов обеспечивать справедливое и быстрое правосудие для своих..

Введение в машинное обучение для обнаружения аномалий (часть 1)
Тщательно созданный, тщательно спроектированный ресурс для специалистов по данным. Часть 1 Главы 03 из Руководства по машинному обучению для обнаружения аномалий Внимание! Прежде чем вы..

Начало работы с Pulumi в Digital Ocean
Цифровой океан (ДО) — отличная альтернатива многим другим поставщикам облачных услуг. DO предоставляет простой и понятный пользовательский интерфейс, упрощающий управление инфраструктурой и..