none
Mit WPF eine Form laden und WPF schließen RRS feed

  • Frage

  • Hallo Community,

    leider konnte ich mit Google nichts finden was mir weiterhilft..

    Ich habe ein Programm als WPF (W-FORM), welches in gewissen Zeitabständen nach veränderten Dateien prüft. Wenn dies der Fall ist, wird ein neues Windows.Formular (U-FORM) gestartet an dem die Liste der Dateien von W-FORM übergeben wird. Dieses Formular soll dann eine Art Update durchführen. Hierbei muss W-FORM geschlossen werden. Wenn ich das allerdings mache, dann schließen alle Formen. Hier der Code-Auschnitt:

    //Code wird in W-Form ausgeführt:

    public bool StartUpdate { set { if (value == true) { List<WGLUpdater.FilePool> files = new List<WGLUpdater.FilePool> { new WGLUpdater.FilePool { source = ".\\pool\\file1", target = ".\\programm\\file1" } }; WGLUpdater.UPTForm uForm = new WGLUpdater.UPTForm(files); uForm.Show();

    this.Close(); } else { } } }

    Könnte mir jemand ein paar Tipps geben?

    Vorab vielen Dank !

    Gruß John

    Montag, 6. April 2020 12:35

Antworten

  • Hallo JohnPlrz,

    In Deinem Codeausschnitt ist kein privates Feld zu sehen, dem in der set-Zugriffsmethode (set-Accessor) der Wert von value (wenn auch nach Überprüfung der Bedingung) zugewiesen wird. Hast Du eins und wenn ja, wie wird ihm ein Wert zugewiesen?

    Wenn Du keins deklariert hast, beachte, dass ein privates Feld vom Compiler generiert wird. Das folgende ist eher ein Schuss ins Blaue, aber im Hinblick auf Deinen Code bietet sich die Frage an, ob Du es mit einer StartUpdate-Methode, die einen booleschen Parameter akzeptiert und an der geeigneten Stelle aufgerufen wird, versucht hast?

    public void StartUpdate(bool start)
    {
        if(start == true)
        {
            //....
        }
        else
        {
            //...
        }
    }

    Wenn Du es bei einer Eigenschaft belassen möchtest, aber kein privates Feld brauchst und den Wert nur durch Klassenmitglieder zuweisen möchtest, kommt ein private set in Frage. Wenn Du nur im Konstruktor den Wert zuweisen möchtest, kannst Du die set-Zugriffsmethode auslassen. Sieh Dir dazu diese Threads an:
    C# properties: how to use custom set property without private field? (zweite Antwort)
    C# Property with no setter - how can it get set from constructor?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 10. April 2020 15:22
    Administrator

Alle Antworten

  • Letzter Eintrag von mir war falsch..

    • Bearbeitet JohnPlrz Montag, 6. April 2020 13:16
    Montag, 6. April 2020 13:07
  • Kann mir denn keiner helfen?
    Dienstag, 7. April 2020 14:15
  • Hallo JohnPlrz,

    In Deinem Codeausschnitt ist kein privates Feld zu sehen, dem in der set-Zugriffsmethode (set-Accessor) der Wert von value (wenn auch nach Überprüfung der Bedingung) zugewiesen wird. Hast Du eins und wenn ja, wie wird ihm ein Wert zugewiesen?

    Wenn Du keins deklariert hast, beachte, dass ein privates Feld vom Compiler generiert wird. Das folgende ist eher ein Schuss ins Blaue, aber im Hinblick auf Deinen Code bietet sich die Frage an, ob Du es mit einer StartUpdate-Methode, die einen booleschen Parameter akzeptiert und an der geeigneten Stelle aufgerufen wird, versucht hast?

    public void StartUpdate(bool start)
    {
        if(start == true)
        {
            //....
        }
        else
        {
            //...
        }
    }

    Wenn Du es bei einer Eigenschaft belassen möchtest, aber kein privates Feld brauchst und den Wert nur durch Klassenmitglieder zuweisen möchtest, kommt ein private set in Frage. Wenn Du nur im Konstruktor den Wert zuweisen möchtest, kannst Du die set-Zugriffsmethode auslassen. Sieh Dir dazu diese Threads an:
    C# properties: how to use custom set property without private field? (zweite Antwort)
    C# Property with no setter - how can it get set from constructor?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 10. April 2020 15:22
    Administrator
  • Hallo Dimitar,

    danke für deine Antwort. Aber ich habe es wahrscheinlich falsch formuliert. Ich möchte gerne die zweite Form (U-Form) unabhängig von der ersten machen. Stand jetzt ist, wenn ich W-Form schließe, schließen beiden Formen. Das möchte ich aber nicht. Es soll nur W-Form geschlossen werden.

    Der obere Code-Ausschnitt ist nicht vollständig ;-)

    Gruß John

    Donnerstag, 30. April 2020 18:48
  • Hallo John,

    Dein W-Form ist das Hauptformular der Anwendung, das U-Form ist ein untergeordnetes. Wenn das Hautformular  geschlossen wird, wird immer die gesamte Anwendung beendet. Man müsste deshalb zur Laufzeit das U-Formular zum Hauptformular erklären. Ob gas geht entzieht sich meiner Kenntnis.

    Ich würde für Dein Problem auf 2 Anwendungen aufteilen. Wenn die W-Anwendung Änderungen feststellt, wird die U-Anwendung gestartet und die W-Anwendung geschlossen. Die Daten kannst Du per Parameter, Zwischenablage oder Datei übergeben.

    Gruß Klaus

    Freitag, 1. Mai 2020 12:17
  • Hallo Klaus,

    hierbei handelt es sich bereits um zwei verschiedene Anwendungen. Das U-Formular liegt als Verweis dem W-Formular vor und übergebe wie oben im Code-Ausschnitt (WGLUpdater.UPTForm uForm = new WGLUpdater.UPTForm(files);) zu sehen Parameter. In dem Fall "files".

    Gruß

    John

    Freitag, 1. Mai 2020 13:27
  • Hallo John,

    uForm wird ja in Deinem Code-Ausschnitt im W-Form deklariert, und ist demzufolge auch ein Objekt von W-Form und wird mit dessen Beendigung auch beendet.

    Wenn U-Form eine 2. Anwendung ist, würde ich sie wie folgt in einem neuen Prozess starten:

    string Parameter = ".\\pool\\file1,.\\programm\\file1";

    Process.Start("C:\\...\UForm.exe", Parameter);


    Ich hoff ich habe Dein Problem jetzt richtig verstanden.

    Gruß Klaus

     

    Freitag, 1. Mai 2020 14:32
  • Hallo Klaus,

    danke für deine Hilfe, allerdings werde ich das Problem nun mit der Methode Process.Start() und den Klassen NamedPipeServer- und NamedPipeClientStream lösen, da ich ein paar Daten mehr an das andere Programm senden möchte.

    Gruß John 


    Sonntag, 3. Mai 2020 10:04