In einer WPF-Anwendung möchten Sie UI-Elemente aktualisieren (z. B. , Fortschrittsbalken, Textblock) während langwieriger Berechnungen, die in einem Hintergrundthread ausgeführt werden, der zu einer anderen Klasse gehört. Sie sind sich jedoch nicht sicher, wie Sie diese Herausforderung angehen sollen, da sich herkömmliche Methoden als unwirksam erwiesen haben.
Die effektivste Lösung ist die Verwendung von Ereignissen und Dispatchern. So geht's:
Ereignisdeklaration in der Berechnungsklasse:
In der für die Berechnungen verantwortlichen Klasse (z.B. , calcClass) deklarieren ein Ereignis, um die Benutzeroberfläche über den Fortschritt zu informieren Aktualisierungen:
public event EventHandler<EventArgs<YourStatus>> ProgressUpdate;
Veranstaltungsanmeldung in der Hauptklasse:
Im Wesentlichen UI-Klasse (z. B. MainWindow), registrieren Sie sich beim ProgressUpdate Ereignis:
calcClass.ProgressUpdate += (s, e) => { Dispatcher.Invoke((Action)delegate() { /* Update UI */ }); };
Ereignisauslösung in der Berechnungsklasse:
Innerhalb der Berechnungsmethode, lösen Sie bei Bedarf das ProgressUpdate-Ereignis aus:
//part 1 if(ProgressUpdate != null) ProgressUpdate(this, new YourStatus(status)); //part 2
Während Ereignisse und Dispatcher im Allgemeinen bevorzugt werden, können Sie Alternativ könnte eine BackgroundWorker-Komponente verwendet werden:
Worker Creation und Ereignisverarbeitung in der Hauptklasse:
var worker = new BackgroundWorker(); worker.DoWork += (s, e) => { /* Perform calculations */ }; worker.ProgressChanged += (s, e) => { /* Update UI with progress */ }; worker.RunWorkerCompleted += (s, e) => { /* Finalize UI updates */ };
Berechnungen im Hintergrund in der Berechnungsklasse starten:
worker.RunWorkerAsync(input);
Denken Sie daran, dass die Verwendung von Ereignissen und Dispatchern im Vergleich zu mehr Kontrolle und Flexibilität bietet BackgroundWorker.
Durch die Anwendung dieser Techniken können Sie UI-Elemente effizient aus Hintergrundthreads aktualisieren und so Reaktionsfähigkeit und nahtlose Benutzerinteraktion gewährleisten.
Das obige ist der detaillierte Inhalt vonWie aktualisiere ich eine WPF-Benutzeroberfläche sicher aus einem Hintergrundthread in einer separaten Klasse?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!