Как сказал Флитор, лучший способ добиться этого - Progress<T>
.
. Я кратко иллюстрирую, как это использовать.
Во-первых, вам нужно создать Property
в вашей модели представления, чтобы вы могли связать значение ProgressBar с чем-либо. Ваша ViewModel должна будет реализовать INotifyPropertyChanged
, чтобы свойство set
могло вызвать RaisePropertyChangedEvent
.
Затем создайте Progress внутри метода, вызываемого нажатием кнопки, и передайте его своему рабочему методу. Для этого используйте ICommand, чтобы он мог быть привязан к вашей кнопке (вам не нужно событие Click). Примерно так:
var progress = new Progress<int>(percent =>
{
ProgressProperty = percent;
});
await Task.Run(() => myWorker(progress));
Наконец, в вашем рабочем методе вы периодически обновляете значение следующим образом:
private void myWorker(IProgress<int> progress)
{
progress.Report(1);
// ...
progress.Report(100);
}
В порядке пояснения: я использовал целое число, но вы также можете использоватьдвойной, если вы хотите действительно хорошие расчеты! Конструктор объекта Progress принимает в качестве параметра ProgressProperty (имя, которое я дал свойству, которое привязывается к ProgressBar). Это означает, что когда работник вызывает Report (), ProgressProperty автоматически обновляется с новым значением, и, следовательно, может быть отражено в пользовательском интерфейсе. Наконец, ваш рабочий метод вызывается с помощью await, чтобы пользовательский интерфейс мог обновляться при каждом увеличенном значении.
Полное объяснение хода выполнения см. В blog
Стивена Клири