Как реализовать индикатор выполнения с использованием шаблона MVVM
У меня есть приложение WPF, которое построено на шаблоне проектирования MVVM.
Я хочу реализовать индикатор выполнения в приложении, который следует за шаблоном MVVM.
Есть ли у кого-нибудь какие-либо предложения о том, как это реализовать?
- WPF WebBrowser Control - позиция: фиксированный Перемещение элемента при прокрутке (Windows 8)
- Как заставить WPF использовать URI ресурсов, которые используют сильное имя сборки? Argh!
- Опции для встраивания Chromium вместо IE WebBrowser с WPF / C #
- Как получить список коллекции значений из app.config в WPF?
- Ужасная работа пользовательского контроля
заранее спасибо
- Изменение цвета фона для выбранного элемента ListBox
- Как включить внешний шрифт в приложение WPF без его установки
- Производительность WPF Datagrid
- WPF: объявления свойств XAML не устанавливаются через Setters?
- Обеспечение того, чтобы все выполнялось в streamе пользовательского интерфейса в WPF
- Как установить событие MouseOver / триггер для границы в XAML?
- Как создать пользовательский хром в wpf?
- Является ли реализация Джошем Смитом RelayCommand ошибочной?
Как правило, ваш пользовательский интерфейс просто привязывается к свойствам вашей виртуальной машины:
Ваша виртуальная машина будет использовать BackgroundWorker
для работы над фоновым streamом и периодически обновлять значение CurrentProgress
. Что-то вроде этого:
public class MyViewModel : ViewModel { private readonly BackgroundWorker worker; private readonly ICommand instigateWorkCommand; private int currentProgress; public MyViewModel() { this.instigateWorkCommand = new DelegateCommand(o => this.worker.RunWorkerAsync(), o => !this.worker.IsBusy); this.worker = new BackgroundWorker(); this.worker.DoWork += this.DoWork; this.worker.ProgressChanged += this.ProgressChanged; } // your UI binds to this command in order to kick off the work public ICommand InstigateWorkCommand { get { return this.instigateWorkCommand; } } public int CurrentProgress { get { return this.currentProgress; } private set { if (this.currentProgress != value) { this.currentProgress = value; this.OnPropertyChanged(() => this.CurrentProgress); } } } private void DoWork(object sender, DoWorkEventArgs e) { // do time-consuming work here, calling ReportProgress as and when you can } private void ProgressChanged(object sender, ProgressChangedEventArgs e) { this.CurrentProgress = e.ProgressPercentage; } }
Используйте элемент управления ProgressBar
и привяжите его свойство Value
к свойству ViewModel:
Посмотреть
ViewModel
private double _currentProgress; public double CurrentProgress { get { return _currentProgress; } private set { _currentProgress = value; OnPropertyChanged("CurrentProgress"); } }
Добавьте два свойства к вашей виртуальной машине:
bool IsProgressBarVisible double ProgressValue
Если вы запустите длительную операцию в своей виртуальной машине, установите для свойства IsProgressBarVisible значение true и установите периодичность ProgressValue на текущее значение прогресса. Попробуйте вычислить значение от 0 до 100. Это имеет то преимущество, что вам не нужно предоставлять минимальное и максимальное значение. После завершения асинхронной операции установите для параметра IsProgressBarVisible значение false.
В XAML свяжите эти два свойства. Используйте конвертер значений, чтобы преобразовать булевскую видимость в видимость.