Zugriff auf Controlproperties von einem anderen Window

  • WPF

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Zugriff auf Controlproperties von einem anderen Window

    Mahlzeit und hallo,

    ich versuche gerade, von meinem MainWindow aus auf eine Progressbar auf einem Window namens SplashScreen zuzugreifen.

    Folgendes hab ich:

    SplashScreen.barFortschritt.Minimum = 0

    VB.NET-Quellcode

    1. Public Class SplashScreen
    2. Friend Shared Function barFortschritt() As ProgressBar
    3. Throw New NotImplementedException()
    4. End Function
    5. End Class


    und den Fieldmodifier von barFortschritt auf Public gesetzt.

    Beim Ausführen kommt es zu dem Fehler "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt... SplashScreen.barFortschritt hat Nothing zurückgegeben..." im ersten Codeschnipsel.

    Kann mir jemand helfen?
    Hallo

    Du musst dir ja zuerstmal die Instanz des offenen Windows holen. Am einfachsten indem du dir die Instanz in eine Variable innerhalb deines MainWindow packst.
    Ich denke ich muss nicht wieder sagen das du hier NICHT mit Binding arbeitest und dadurch für dich alles einfach schwieriger wird. Habe ich ja schon oft genug, in deinem anderen Tread mit dem Beispiel von mir hast du dich leider nicht mehr gemeldet soweit ich das im Kopf habe. ;)

    Grüße
    Sascha

    Edit: Gesehen das du einen anderen Thread auch erstellt hattest, dort hast du auch die antwort, was dies betrifft ist das Vorgehen nämlich genau gleich wie in WinForms.
    Du benötigst die Instanz(!!!) des Fensters. Entweder diese ermittels anhand aller geöffneten (Google??) oder merken falls dies möglich (ich kenne ja deinen Code nicht).

    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Nofear23m“ ()

    @Nofear23m

    Ich glaub ich habs hinbekommen. Kanns leider grad net testen aufgrund anderer "roter Stellen" in meinem Programm. Ich halte dich auf dem Laufenden :thumbsup:

    Eigentlich dachte ich ich hätte genau das mit der Fensterinstanz schon probiert gehabt, aber da muss ich irgend einen Fehler gemacht haben... ?(

    Wenn ich mich bei dem anderen Thread net mehr gemeldet hab dann hab ich das wohl irgendwie vergessen, war keine Absicht... Hab leider net jeden Tag den Kopf zu programmieren, bei meinen vielen Threads kann da schon mal was untergehen. 8o

    @Nofear23m

    Alles klar es funktioniert. Danke :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „kafffee“ ()

    Nun doch noch mal ein Problem:

    Ich muss im Setter einer Klasse auf eine Public listAlleGenres(Of String) zugreifen, die in meiner MainWindow-Klasse definiert ist. Wenn ich nun eine neue (!) Instanz von MainWindow (Dim Hauptfenster As New MainWindow) erstelle klappt das zwar, aber ich glaub dann lädt der Computer ein zweites (neben der angezeigten) unsichtbares MainWindow. Denn wenn ich das Programm mit dem X Oben rechte schliesse, schliesst sich zwar das MainWindow aber das Programm läuft weiter...

    Also doch mit Binding?

    Meine Idee:
    Meine jetzige Klasse ClassGenres enthält eine Property Vorhanden As Boolean und eine Property Genre As String. So. Ich habe nun eine Suchfunktion geschrieben, die prüfen soll, ob ein String mit einem Genre (z.B. "Rock/Pop") in der listAlleGenres(Of Class Genres) in dieser Liste "Vorhanden" ist und dann True oder False zurückgibt.

    >>>> Ich würde da einfach im Setter von Vorhanden(welcher sich ändern kann) einfach einer Variable List(Of String) (die Teil der ClassGenres ist) immer diejenigen Items zuweisen, welche "Vorhanden" sind mittels einer Schleife.

    Und dann diese Liste nach z.B. "Rock/Pop" durchsuchen mittels einer weiteren Schleife (im Getter einer weiteren Property innerhalb der Klasse)

    Ich hoffe ihr versteht wie ich das meine, ist ziemlich schwer das mit Worten zu beschreiben.

    Ich glaube aber meine Idee ist so ziemlich "von hinten durch die Brust ins Auge".

    Kennt einer vielleicht eine elegantere Vorgehensweise?

    kafffee schrieb:

    Ich glaube aber meine Idee ist so ziemlich "von hinten durch die Brust ins Auge".

    Leider finde ich das trifft ansich für das ganze vorgehen zu.

    kafffee schrieb:

    Wenn ich nun eine neue (!) Instanz von MainWindow (Dim Hauptfenster As New MainWindow) erstelle klappt das zwar, aber ich glaub dann lädt der Computer ein zweites (neben der angezeigten) unsichtbares MainWindow.

    Ja, das ist genau das was dir alle versucht haben im anderen Thread zu erklären. Du musst erstmal verstehen wie die objektorientierte Programmierung funktioniert. das wurde dir schon versucht zu erklären.

    Du hast eine Klasse. (Ist wie eine art Bauplan) Und ja, ein Window ist auf eine Klasse. Alles in der objektorientierten Programmierung basiert auf klassen.
    Gut, wenn du eine Instanz einer Klasse erstellst. z.b. mit ​Dim win1 As New MainWindow() oder ähnlichem dann hast du eine Instanz dieser Klasse. Wenn wir das auf den Bauplan ummünzen hättest du in diesem Fall nun ein Haus vor dir stehen. Dieses Haus entspricht dem des Baumplans. Im Bauplan ist z.b. definiert das du eine Eingangstüre an der Front des Hauses hast. Die Farbe kann sich der Käufer aber aussuchen. Bei diesem Haus soll die Türe Blau sein.

    Nun erstellst du eine neue Instanz. (Ein neues Haus)

    Nun sagst du bei diesem Haus das die Türe rot sein soll. Super. Du hast nun ein Haus mit roter Türe und eines mit einer blauen.
    Wenn du nun diese zweite Instanz hernimmst (das Haus mit der roten Türe) und sagst das die Türe aufgehen soll, was denkst du passiert beim Haus mit der blauen Türe? Richtig, sie bleibt zu. Du hast ja auch nur bei dem Haus mit der roten Türe diese aufgemacht. Beim Haus mit der blauen Türe ist diese weiterhin zu.

    Es ist also völlig logisch das wenn du eine neue Instanz von einem Window erstellst und dieses noch nicht mal öffnest (win.Open()), dieses auch nicht schliessen kannst und dieses auch nicht zu Gesicht bekommst.
    Du musst dir als die richtige Instanz (!!!!!) des Window welches du gerade siehst holen.

    Du hast aber viel zu wenig von deinem Code und/oder deinen Klassen gezeigt um dir ein Beispiel erstellen zu können. Hier wäre wieder ein Minibeispiel-Projekt ideal.
    Aber Grundsätzlich solltest du entweder anfangen mit Binding zu arbeiten oder mit dem Murks soweit alles verbiegen das es funzt. Ein Mischmasch von beiden ist eher schwierig.

    Du solltest dich entscheiden. Ich weis, es ist schwer - gerade wenn man ein vorhandenes Projekt auf WPF neu aufsetzen will, möchte man sich eben mit neuem nicht rumschlagen und schnell ans ziel kommen, aber für den Lerneffekt ist dies eher schlecht.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Wichtig ist das du Klassen und Instanzen verstehst. Dann bildest du die "echte Welt" in Klassen ab und kannst dann damit sauber arbeiten. Du hast ja das Minibeispiel mit dem Player, der veranschaulicht das ja ganz gut.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Achja, ich habe vor dieses Wochenende auf Discord aktiv zu sein, da kannst du dann gerne Fragen stellen. Aber hierfür schreib ich später noch was in den Supportthread meiner Tutorialreihe rein. ;)
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Schau mal in folgendem Thread!! Da steht alles beschrieben. Gilt für euch beide ;)
    Vb-paradise Discord?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##