Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Object an Funktion übergeben und wieder benutzen
Olympiakos25
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Object an Funktion übergeben und wieder benutzen

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 152

beantworten | zitieren | melden

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;

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von dannoe am .
private Nachricht | Beiträge des Benutzers
Olympiakos25
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

beantworten | zitieren | melden

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!!!
private Nachricht | Beiträge des Benutzers
Wilfried
myCSharp.de - Member

Avatar #2TnJ7IKlYXgOor5sZSIA.jpg


Dabei seit:
Beiträge: 87
Herkunft: Radeberg

beantworten | zitieren | melden

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 !

GidF
private Nachricht | Beiträge des Benutzers