Laden...

Object an Funktion übergeben und wieder benutzen

Erstellt von Olympiakos25 vor 3 Jahren Letzter Beitrag vor 3 Jahren 293 Views
O
Olympiakos25 Themenstarter:in
2 Beiträge seit 2021
vor 3 Jahren
Object an Funktion übergeben und wieder benutzen

Hallo zusammen! 🙂

Ich hänge an einem Problem, welches ich aktuell nicht lösen kann. Vermutlich für die meisten eine Grundlage, aber ich bin noch relativ neu was das programmieren angeht und probiere gerade diverse Dinge aus.
Unter anderem wollte ich mir mal ansehen, wie Ladebalken in WPF funktionieren. Ich habe einige schöne Tutorials im Internet gefunden und habe mir den Code aus einmal mal als Vorlage zum Verständnis genommen.

Es geht um folgenden Abschnitt:


public partial class MainWindow : Window
{
        public MainWindow()
        {
            InitializeComponent();
        }

        private void startWork_Click(object sender, RoutedEventArgs e)
        {
            BackgroundWorker worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.DoWork += worker_DoWork;
            worker.ProgressChanged += worker_ProgressChanged;
            worker.RunWorkerCompleted += worker_RunWorkerCompleted;
            worker.RunWorkerAsync(this);
        }

        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            throw new NotImplementedException();
        }

        private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar.Value = e.ProgressPercentage;
        }

        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            MainWindow hauptfenster = sender as MainWindow;

            if (hauptfenster.TextBox1.Text != "")
            {
                   ...........

Es wird also das MainWindows initalisiert und wenn ich dort auf den Button "startWork" drücke wird die Funktion "startWork_Click" ausgeführt.
Diese soll nun mit dem BackgroundWorker die eigentliche Aufgabe auf einen anderen Thread auslagern, damit der Hauptthread (welcher das UI erstellt hat) das UI updaten kann.
Die eigentliche Aufgabe wird dann über:


worker.RunWorkerAsync(this);

gestartet.
Meiner Meinung nach, übergebe ich hier mit "this" das Objekt MainWindow um es auf dem anderen Thread benutzen zu können.
Da ich nur ein "generelles" Objekt übergeben kann, muss ich es als erstes wieder zu einem MainWindow machen.
Wenn ich nun auf "hauptfenster" zugreife, bzw. das Programm ausführe, bekomme ich den folgenden Fehler: "Object reference not set to an instance of an object."

Kann mir da jemand helfen? Es scheint so trivial zu sein, dass ich dazu im Internet nichts finde!?


MainWindow hauptfenster = sender as MainWindow;

Der Befehl müsste eine Instanz vom Objekt erzeugen!?

Vielen Dank im Vorraus!!! 🙂
(Ich habe versucht das Problem so genau wie möglich zu beschreiben)

D
261 Beiträge seit 2015
vor 3 Jahren

Der sender ist normalerweise immer die Instanz des Objektes, das das Ereignis ausgelöst hat. In diesem Fall also der BackgroundWorker.
Da du einen BackgroundWorker nicht in ein MainWindow casten (umwandeln) kannst, ist dein hauptfenster eben null.

Das was du benötigst ist das Property Argument von der DoWorkEventArgs Klasse bzw. des e-Parameters:


MainWindow hauptfenster = e.Argument as MainWindow;

O
Olympiakos25 Themenstarter:in
2 Beiträge seit 2021
vor 3 Jahren

Vielen Dank für die sehr schnelle Antwort! 🙂

Damit funktioniert es, bzw. ich stoße auf den nächsten Fehler, weil ich das MainWindow wohl nicht übergeben darf. Mit einem anderen Objekt funktioniert es aber.
Vielen Dank!!! 🙂

190 Beiträge seit 2012
vor 3 Jahren

Hallo,
da du mit WPF arbeitest, beschäftige dich unbedingt mit [Artikel] MVVM und DataBinding. Alles andere wird Murks.

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF