Implémenter progressbar dans cette application WPF simple

J’ai MainWindow qui a son viewmodel MainWindowViewModel. À l’intérieur de la fenêtre, il y a une zone de texte qui accepte les entrées de l’utilisateur et quelques boutons radio pour filtrer la recherche et un bouton. L’action du bouton est liée au modèle de vue à l’aide d’une commande telle que:

Dans ViewModel, il y a:

 public ICommand SearchByCommand { get { if (_SearchByCommand == null) { _SearchByCommand = new RelayCommand( x => this.LoadData(this.SearchBy), x => { return !ssortingng.IsNullOrEmpty(this.SearchText); } ); } return _SearchByCommand; } } 

Et LoadData:

 private void LoadData(ssortingng searchBy) { switch(searchBy) ... } 

Cela fonctionne parfaitement, mais je ne sais pas comment implémenter une barre de progression dans cette solution. Lorsque l’utilisateur clique sur le bouton de recherche, la barre de progression doit commencer la progression et geler l’interface utilisateur actuelle. Après le chargement des données dans la méthode LoadData, progresscount de la barre de progression doit se terminer et réactiver l’interface utilisateur.

Vous pouvez utiliser le code Occupé de la boîte à outils WPF étendue: ici .

Ensuite, vous devez effectuer votre traitement ( LoadData ) dans un autre thread afin de ne pas geler l’interface utilisateur. Pour ce faire, le moyen le plus simple consiste à utiliser un agent d’exploitation:

Ajoutez un booléen à votre wm pour indiquer quand l’application est occupée:

 private bool isBusy; public bool IsBusy { get { return isBusy; } set { this.isBusy = value; this.OnPropertyChanged("IsBusy"); } } 

Configurez le travailleur de fond:

 private void LoadData(ssortingng searchBy) { IsBusy = true; BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (o, ea) => { //Do your heavy work here }; worker.RunWorkerCompleted += (o, ea) => { IsBusy = false; }; worker.RunWorkerAsync(); } 

Si vous souhaitez afficher une barre de progression indiquant l’état d’avancement de votre traitement, vous devez effectuer un peu plus de travail. Tout d’abord, vous devez appliquer un style personnalisé à l’indicateur occupé:

      

Ajoutez ensuite une propriété ProgressValue à votre machine virtuelle:

 private int progressValue ; public int ProgressValue { get { return progressValue ; } set { this.progressValue = value; this.OnPropertyChanged("ProgressValue "); } } 

Et signaler les progrès de l’arrière-plan:

 BackgroundWorker worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.DoWork += (o, ea) => { //Do your heavy work here worker.ReportProgress(10); //Do your heavy work here worker.ReportProgress(20); //And so on }; worker.ProgressChanged += (o,ea) => { ProgressValue = e.ProgressPercentage; }; worker.RunWorkerCompleted += (o, ea) => { IsBusy = false; };