J'ai déjà recherché le forum mais aucune question posée ne correspond à mon problème je pense ...Pourquoi BackgroundWorker_RunWorkerCompleted ne met-il pas à jour l'interface graphique?
J'utilise un BackgroundWorker pour gérer une opération qui prend beaucoup de temps. Une fois cette opération terminée, un bouton doit être activé pour que l'utilisateur puisse effectuer une autre opération. J'utilise WPF et je suis le modèle MVVM, donc je n'ai pas d'accès direct à ce bouton. Je dois appeler une méthode dans le gestionnaire d'événements BackgroundWorker_RunWorkerCompleted qui définit une propriété, représentant les boutons enabled-state, à true.
Tout cela fonctionne bien, sauf une chose: le bouton est seulement redessiné après I par exemple. cliquez dans la fenêtre (ou agrandissez la fenêtre, ...). Cest très ennuyeux et moi avons pris toute la journée pour se débarrasser de ce comportement, mais je ne peux pas trouver une solution ...
Le gestionnaire d'événements BackgroundWorker_RunWorkerCompleted ressemble à ceci:
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
Quelqu'un at-il une idée résoudre ce problème?
Edit:
Le bouton est lié à une commande:
<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>
Cette commande est un RelayCommand comme Smith a déclaré dans son blog (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) et ressemble à ceci:
public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}
this.CanLoadTarget est défini sur true par SetButtonToEnabled(); méthode
Edit 2:
le code suivant 'fonctionne':
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
mais qui est une sorte de code très dangereux et laid ...
Lorsque vous définissez la propriété sur true, relancez-vous l'événement 'PropertyChanged' (c'est-à-dire que votre viewmodel implémente' INotifyPropertyChanged' correctement)? –
Si j'appelle cette méthode après fileLoadBackgroundWorker.RunWorkerAsync() tout fonctionne bien, donc je ne pense pas que ce soit le problème ?! – lakai
Juste par curiosité, utilisez-vous des modifications WMI à la forme ou à la bordure du formulaire (couleur de la bordure, etc.)? –