Animation bei Form wechsel

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von cl10k.

    Animation bei Form wechsel

    Hallo,

    wenn man zwischen zwei Forms mittels

    Form1.Hide()
    Form2.Show()

    wechselt, gibt es unter Windows7 (ich glaube unter XP war das nicht so) eine kurze Überblend-Animation. Kann man das abstellen?

    Außerden stört mich das Verhalten der Forms in der Taskbar. Beim Wechsel wird der Taskbar-Eintrag von Form1 ausgeblendet und zeitgleich rechts davon der Eintrag von Form2 eingeblendet und im Anschluss nach links an die alte Position von Form1 verschoben. Kann man dieses Verhalten unterbinden und global für beide Forms immer den gleichen (festen) Eintrag in der Taskbar verwenden?

    Google spuckt mir bisher garnichts in der Richtung aus...


    lg
    Ansich lässt sich sowas nur schwer realisieren, soweit ich weiß...
    Auch wenn das jetzt erstmal ermahnend klingt:
    Wofür brauchst du einen übergang zwischen Formen?
    Meistens kann man das mit TabControls besser lösen, was auch für den Benutzer angenehmer ist.

    Valerian

    cl10k schrieb:

    VB.NET-Quellcode

    1. Form1.Hide()
    2. Form2.Show()
    ist Clusterfuck oder wie das heißt.
    Verwende bitte mit New erstellte Instanzen Deiner Formen.
    Bei Form1 ist das üblicherweise Me.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke!

    Ich ahnte schon das es darauf hinaus läuft. Dann habe ich jetzt wohl endlich einen guten Grund auf TabControl umzustellen...

    lg

    @Rod

    Ich fange gerade erst mit OOP an. Ich habe (z.B.) 6 Forms designed zwischen denen ich hin und herschalte. Mir erschließt sich einfach nicht der Grund für die Instanzierung von Forms. Das sind doch quasi-statische Klassen. ???

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

    cl10k schrieb:

    Das sind doch quasi-statische Klassen. ???
    Genau das ist das Problem.
    Das kommt wegen der Kompatibilität zu VB6 und ähnlichen Mumien. In C# gibt es solch Konstrukt nicht.
    Versuch mal, die Form2 gleichzeitig 2 Mal zu öffnen.
    Versuch mal, von Form2 nach Form1 ein Event zu senden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was es doch nicht alles gibt... ^^
    msdn.microsoft.com/en-us/libra…op/ms632669(v=vs.85).aspx

    Das sollte die Lösung für dein Problem sein.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Nein immer. Form1.* gibts nicht mehr für dich. Alles geht über eine Instanz.
    Dim frm as Form1
    frm = New Form1() 'hier wird die Instanz erstellt
    frm.Show() 'hier wird die Form angezeigt

    Gleiches Prinzip gilt für deine anderen Forms.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Nicht, wenn Du die Variable, die Form2 darstellt, klassenweit verfügbar machst.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents _f2 As Form2
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. If IsNothing(_f2) Then
    5. _f2 = New Form2
    6. _f2.Show()
    7. Else
    8. _f2.Visible = True
    9. End If
    10. End Sub
    11. Private Sub _f2_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles _f2.FormClosing
    12. _f2 = Nothing
    13. End Sub
    14. End Class


    In Form2 kannst Du evtl. so etwas in der Art machen:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    3. Me.Hide()
    4. End Sub
    5. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    6. Me.Close()
    7. End Sub
    8. End Class
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    cl10k schrieb:

    Bei jeder Instanzierung geht doch der Inhalt meiner Controls verloren.
    Nein. Alles, was Du im Designer "gemalt" hast, wird ordnungsgemäß dargestellt. Dafür sorgt die Prozedur InitializeComponents().
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Darfst halt die Form2 nicht mit .Close() schliessen, sondern .Hide() aufrufen, dann bleibt alles erhalten. Probiers halt aus, so siehst es sofort.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @ SpaceyX

    Aber dann bin ich ja wieder bei meiner Ausgangssituation mit der dieser Thread begann. Ich habe n Forms zwischen denen ich mit Hide/Show hin- und herschalte. Die Instanzierung geschieht ja quasi bei Programmstart automatisch.

    Ich glaube wir reden grad aneinander vorbei. Ich missbrauche mehrere Forms für eine Funktionalität die eigentlich das Tabcontrol bereitstellt. Das werde ich jetzt erstmal abstellen, damit meine eingangs geschilderten Probleme gelöst sind.

    Alle weitere Verwirrung entstammt dem Beitrag von Rod, Forms doch bitte generell zu instanzieren. Und ja, wenn ich so darüber nachdenke, wird klar warum das Sinn macht -> Danke an Rod für den Denkanstoß!
    Jo, das weiss ich, dass Du dann wieder beim Ausgangsproblem bist. Wollt Dir nur zeigen, wie Rod es gemeint hat, mit richtigen Instanzen zu arbeiten. Mehr nicht.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Falls du bisher nicht das Tabcontrol genommen hast, da du keine Reiter sondern eigene Vor-/Rück-Buttons willst: [VB.NET] TabControl ohne Reiter
    Wenn du mehrere Forms hast würd ich die Instanzen einfach in eine Liste oder vll. sogar ein Dicitionary packen. Dadurch haste praktisch eine ähnliche funktionalität wie die Itemseigenschaft im TabControl.
    Kannst ja noch ne Art Wrapper rum schreiben so ne Art WindowManager wo die Instanzen verwaltet und du einfach nur sagst Form1 einblenden und Form2 ausblenden usw.
    Wobei mir gerade einfällt, dass natürlich Namen wie Form1, Form2 sowei Button1,2...n der Anfang vom Ende sind.
    Nenn die Form1 von mir aus MainWindow, die Form2 SettingsWindow kp. musste natürlich an den Sinn der Form anpassen. Und Buttons wie z.B. Button1 heißt nicht Button1 sondern z.B. btnOpen. Dadurch weißte später noch ganz klar was was ist. Wenn du 5 Forms mit 20 Buttons hast. Dann frag ich dich in nen paar Tagen was war nochmal Button19?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    @BjoNi: Der Tipp ist richtig gut! Tatsächlich nutze ich bisher eine kleine Leiste um zwischen meinen Forms zu navigieren, im Fall fehlerhafter Eingaben bestimmte Optionen zu sperren, etc...

    @thefiloe:

    Ich nutze bereits einen "FormsManager" der sich um Darstellung, etc. kümmert. Aus dem FormsManager wird jetzt halt ein TabManager..

    Meine Forms gehören zusammen mit anderen Objekten zu einer Klasse die ich x-Mal in einem Array instanziert habe.

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