Laden...

Status anzeigen über INotifyPropertyChanged noch während das Programm arbeitet

Erstellt von Steven85 vor 3 Jahren Letzter Beitrag vor 3 Jahren 652 Views
Steven85 Themenstarter:in
99 Beiträge seit 2011
vor 3 Jahren
Status anzeigen über INotifyPropertyChanged noch während das Programm arbeitet

Hallo,

ich habe mir ein Statusfenster gebaut und möchte dieses ständig aktualisieren während der Laufzeit.
Das klappt zwar über INotifyPropertyChanged, jedoch immer nur wenn das Programm gerade nichts zu tun hat. In Win Forms konnte man einfach this.Refresh() machen, was mache ich hier falsch?


namespace PSWPF
{
    public partial class WPFSplashScreen : Window
    {
        #region Props und Konstruktor
        private Status oStatus;

        public WPFSplashScreen(string sProgramName, string sVersion)
        {
            InitializeComponent();

            labProgramName.Content = sProgramName;
            labVersion.Content = sVersion;

            oStatus = new Status();
            this.DataContext = oStatus;
        }
        #endregion

        #region Hilfsmethoden
        public void SetStatusText(string sText)
        {
            oStatus.sStatus = sText;
        }

        public string GetStatusText()
        {
            return oStatus.sStatus;
        }
        #endregion
    }

    public class Status : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string _status;
        public string sStatus
        {
            get { return _status; }
            set
            {
                _status = value.Trim();

                OnPropertyChanged("sStatus");
            }
        }

        private void OnPropertyChanged(string sProperty)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(sProperty));
        }
    }
}

Diesen öffne ich über meine Hauptanwendung und versuche ihn zur Laufzeit zu ändern.


...
this.oWPFSplashScreen = new WPFSplashScreen(this.ProgramName, this.Version);
this.oWPFSplashScreen.Show();

this.oWPFSplashScreen.SetStatusText("Login...");
...

Das Binding funktioniert soweit, jedoch sehe ich den Text "Login..." erst wenn alle Prozesse nach this.oWPFSplashScreen.SetStatusText("Login..."); abgeschlossen sind. Wie bekomme ich den Text noch während die Methode abgearbeitet wird angzeigt?

Da ich noch ziemlicher Anfänger bin würde ich mich über ein ausführliches Beispiel was ich zu tun habe sehr freuen.

Gruß Steven

4.931 Beiträge seit 2008
vor 3 Jahren

Das ist ein Fall von [FAQ] Warum blockiert mein GUI? (s. dann auch "Wie geht es in WPF?")
Alternativ könntest du auch asynchrone Methoden mittels async/await (s. Asynchrone Programmierung mit async und await) benutzen.

Ein Beispiel (zusammen mit MVVM) gibt es unter Async MVVM Modern UI sowie Async Programming : Patterns for Asynchronous MVVM Applications: Data Binding und Async Programming : Patterns for Asynchronous MVVM Applications: Commands.

Als erstes solltest du also deinen Code auf MVVM umstellen: [Artikel] MVVM und DataBinding (denn dafür ist WPF ausgelegt)