Aktualisieren der Benutzeroberfläche mit BackgroundWorker in WPF

8

Ich schreibe gerade eine einfache WPF 3.5-Anwendung, die SharePoint COM zum Aufrufen von SharePoint-Websites und zum Generieren von Gruppen- und Benutzerinformationen verwendet. Da dieser Vorgang eine Weile dauert, möchte ich eine ProgressBar anzeigen, während die Gruppen generiert werden. Der gewünschte Prozess ist wie folgt:

  1. Der Benutzer gibt die URL ein und klickt auf die Schaltfläche, um die Site-Daten abzurufen.
  2. ProgressBar beginnt mit der Animation
  3. Gruppen werden generiert und Namen werden einem ListView hinzugefügt
  4. Nach dem Abschluss endet die ProgressBar-Animation

Das Problem ist, dass die Benutzeroberfläche nie aktualisiert wird. Weder die ProgressBar noch die ListView nehmen Änderungen vor. Wenn jemand irgendwelche Ideen hat, um mit dem Code unten zu helfen, würde es sehr geschätzt.

%Vor%     
pstricker 24.05.2013, 15:38
quelle

3 Antworten

7

Zuerst müssen Sie ProgressChanged -Ereignisse unterstützen. Aktualisieren Sie Ihre BackgroundWorker -Initialisierung auf:

%Vor%

Danach müssen Sie einen OnProgressChanged Handler hinzufügen:

%Vor%

Daher müssen Sie Ihre DoWork :

ändern %Vor%

Das liegt daran, dass Sie die GUI von DoWork nicht ändern dürfen.

Danach wird jedes ListViewItem separat zu deinem ListView hinzugefügt. Ich würde auch empfehlen, dass Ihre URL als Argument an RunWorkerAsync übergeben wird.

Bearbeiten : Fügen Sie einen Prozentsatz zu OnProgressChanged hinzu.

    
Kooki 24.05.2013, 15:56
quelle
2

In Ihrer DoWork-Methode bearbeiten Sie WPF-Steuerelemente in Code in einem Hintergrundthread, den Sie nicht ausführen sollten. Eigentlich sollten Sie Fehler wie "Kann nicht auf andere Steuerung zugreifen" erhalten. Wahrscheinlich werden diese Ausnahmen von Ihrem Catch-All-Fehlerhandler abgefangen, und vielleicht funktioniert auch die MessageBox nicht aus dem Hintergrundthread.

Als schnelle Lösung müssten Sie die Klassenfelder siteURL und collGroups erstellen, alles vor dem using-Block in die GetGroupsAndUsersButton_Click-Methode und alles, beginnend mit der ersten foreach-Schleife bis zum RunworkerCompleted-Ereignis, verschieben, damit der gesamte Code auf die Steuerelemente zugreift läuft auf dem UI-Thread.

Eine andere Sache, die Sie ändern sollten, ist, dass Sie ListViewItems nicht in Code erstellen sollten, sondern stattdessen eine DataTemplate verwenden ... das ist jedoch nicht mit Ihrem Problem verbunden.

    
hbarck 24.05.2013 16:12
quelle
1

Sie benötigen:

%Vor%

Dann in Ihrem DoWork müssen Sie anrufen:

%Vor%

Gut bearbeitete Beispiel hier: Ссылка

    
paul 24.05.2013 15:44
quelle