Использование индикатора выполнения в WPF C # MVVM - PullRequest
0 голосов
/ 23 декабря 2019

Моя цель - обновить индикатор выполнения, пока выполняется другой набор сценариев (вычислений).

Я проследовал за примерами файлов из здесь и попытался привязать его к моему MVVMсценарий, но индикатор выполнения не будет обновляться.

enter image description here

Вот сценарий Progressbar

В сценарииниже я включил progressBarCounter и noOfData в качестве значения в другой скрипт, который вычисляется в методе.

Доказательство того, что данные обновляются

enter image description here

public partial class ProgressBarTaskOnWorkerThread : Window
{
    public ProgressBarTaskOnWorkerThread()
    {
        InitializeComponent();
    }

    private void Window_ContentRendered(object sender, EventArgs e)
    {
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += worker_DoWork;
        worker.ProgressChanged += worker_ProgressChanged;

        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        EtabsDataFormatting.ViewModel.SpliceViewModel data = new EtabsDataFormatting.ViewModel.SpliceViewModel();

        for (int i = data.progressBarCounter; i < data.noOfData;)
        {
            (sender as BackgroundWorker).ReportProgress(i);
        }
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        pbStatus.Value = e.ProgressPercentage;
        int perc = Convert.ToInt32(pbStatus.Value);
        UpdateProgress(perc);
    }

    public void UpdateProgress(int percentage)
    {
        pbStatus.Value = percentage;
        if (percentage == 100)
        {
            Close();
        }
    }
}

Вот часть моего кода XAML для кнопки для запуска вычислений и запуска индикатора выполнения

Команда Binding = RunCalcBtn привязана к сценариям вычисленийпоэтому я создал щелчок для запуска индикатора выполнения.

<Button x:Name = "ApplyButton" Margin="0 1 0 1" Content ="Start Calculation" Command="{Binding RunCalcBtn, Mode=TwoWay}" Click ="PrgBar_Click"/>

Progressbar XAML.cs нажатие кнопки

В этой части отображается индикатор выполнения, ноон не обновляется.

private void PrgBar_Click(object sender, RoutedEventArgs e)
{
    ProgressBar.ProgressBarTaskOnWorkerThread progressWindow = new ProgressBar.ProgressBarTaskOnWorkerThread();
    progressWindow.Show();
}

Большое вам спасибо за помощь мне заранее!

1 Ответ

2 голосов
/ 23 декабря 2019

Как сказал Флитор, лучший способ добиться этого - 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

Стивена Клири
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...