Form erst anzeigen, wenn vollständig geladen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Form erst anzeigen, wenn vollständig geladen

    Hallo Zusammen,

    ich hätte mal wieder gerne ein kleines Schönheits-Problem ;)

    Ich habe das Problem, dass manche Forms bereits sichtbar sind, bevor diese vollständig geladen sind.
    Wenn man die Form öffnet, sieht man dann für einen Bruchteil einer Sekunde dass die Form noch gezeichnet wird.

    Aus diesem Grund würde ich gerne die Form erst dann anzeigen lassen, wenn diese geladen ist.

    Ich habe es mit Me.Opacity = 0 und 1 versucht und habe in der Form DoubleBuffered auf "true". Leider bringt beides keinerlei Besserung.

    Dies ist der Aufruf der Form:

    VB.NET-Quellcode

    1. Dim kdStamm As New C_KUNDENSTAMM
    2. kdStamm.Show()


    Dies ist mein Code in der Form:

    VB.NET-Quellcode

    1. Public Class C_KUNDENSTAMM
    2. Public wcl As New wcl_KUNDENSTAMM(Me)
    3. Private Sub C_KUNDENSTAMM_Close(sender As Object, e As EventArgs) Handles MyBase.Closed
    4. End Sub
    5. Private Sub C_KUNDENSTAMM_VisibleChanged(sender As Object, e As EventArgs) Handles MyBase.VisibleChanged
    6. End Sub
    7. Private Sub C_KUNDENSTAMM_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. Me.Opacity = 0
    9. End Sub
    10. Private Sub C_KUNDENSTAMM_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
    11. Dim rsc As Integer
    12. rsc = wcl.WindowInitialisation()
    13. Me.Opacity = 1
    14. End Sub
    15. End Class


    Habt ihr eine Idee wie ich die Form erst im Form.Shown sichtbar machen kann? ?(

    Vielen lieben Dank schonmal im Voraus! :thumbup:

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

    LassMichInRuhe schrieb:

    VB.NET-Quellcode

    1. rsc = wcl.WindowInitialisation()
    Was passiert da?
    Ruf das mal im Konstruktor der Form auf. Den musst Du Dir vom Studio generieren lassen.

    VB.NET-Quellcode

    1. Public Sub New()
    2. InitializeComponents()
    3. wcl.WindowInitialisation()
    4. End Sub
    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!
    Sorry, hätte ich dazu schreiben sollen.

    Die Methode initialisiert mir einige Controls nachdem die Form angezeigt wurde.
    Sie lädt zum Beispiel die benötigten Werte in eine ComboBox. Die Methode an sich kostet fast gar keine Zeit.

    Auch wenn ich diese auskommentiere habe ich das gleiche Verhalten. Es geht mir eher darum, was davor passiert. ^^
    @Dksksm Das bringt nix.
    @LassMichInRuhe Mach mal in die betroffenen Prozeduren Testausgaben:
    mit separater StopWatch-Instanz im Konstruktor und
    Private sw As New StopWatch
    Console.WriteLine("NAME_DER_PROZEDUR, " & sw.ElapsedMilliseconds)
    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!
    Ok, habe ich gemacht.

    Folgendes kommt dabei heraus:

    VB.NET-Quellcode

    1. C_KUNDENSTAMM - Konstruktor - 298
    2. C_KUNDENSTAMM - Objekt angelegt - 299
    3. C_KUNDENSTAMM_0 - Aufruf Show - 389
    4. C_KUNDENSTAMM_0 - Load - 419
    5. C_KUNDENSTAMM_0 - Activated - 451
    6. C_KUNDENSTAMM_0 - VisibleChanged - 465
    7. C_KUNDENSTAMM_0 - Shown - 467
    8. C_KUNDENSTAMM_0 - Start Initialisation - 467
    9. C_KUNDENSTAMM_0 - Ende Initialisation - 699
    @LassMichInRuhe Dann machst Du mal die Differenzen zweier aufeinander folgender Werte und Du hast die Dauer in Millisekunden.
    Da siehst Du Dir die am längstan dauernden Prozeduren an.
    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 für deine Mühe, aber ich bin mir nicht sicher wo das hin führen soll ;)

    Wie man an folgender Auflistung sehen kann, dauert der "InitializeComponent" in meinem Konstruktor am Längsten:

    VB.NET-Quellcode

    1. - Konstruktor-Start - 7
    2. C_KUNDENSTAMM - Konstruktor-Nach_InitializeComponent - 312
    3. C_KUNDENSTAMM - Objekt angelegt - 312
    4. C_KUNDENSTAMM_0 - Aufruf Show - 403
    5. C_KUNDENSTAMM_0 - Load - 428
    6. C_KUNDENSTAMM_0 - Activated - 473
    7. C_KUNDENSTAMM_0 - VisibleChanged - 490
    8. C_KUNDENSTAMM_0 - Shown - 492
    9. C_KUNDENSTAMM_0 - Start Initialisation - 492
    10. C_KUNDENSTAMM_0 - Ende Initialisation - 690


    VB.NET-Quellcode

    1. Public Sub New()
    2. apifun.TraceMe(Me.Name & " - Konstruktor-Start", Me.sw)
    3. ' Dieser Aufruf ist für den Designer erforderlich.
    4. InitializeComponent()
    5. apifun.TraceMe(Me.Name & " - Konstruktor-Nach_InitializeComponent", Me.sw)
    6. End Sub


    Bei der Form handelt sich dabei um einen Kundenstamm, mit einem Tabcontrol und ca. 8 Tabsheets mit jeweils einer Handvoll Objekte darauf.

    Mich stört ja nicht die Zeit, mich stört es, dass man noch sieht, wie die Form gezeichnet wird.
    Deshalb würde ich gerne die Form erst dann auf "sichtbar" setzen, wenn das Event Form.Shown eingetreten ist.

    Das muss doch irgendwie gehen ?(

    RodFromGermany schrieb:

    @Dksksm Das bringt nix.


    Und warum funktioniert das bei mir?
    Ich mach das schon ewig so, wenn ich solche Formen habe, wo es einfach dauert bis ich es anzeigen mag. Ich entscheide ja wann ich Opacity = 1d setze.
    Zudem mache ich das nie im Form_Load, sondern erst im Form_Shown.
    Oer reagiert VB.NET da so anders als C#? Kann ich mir nicht denken.

    LassMichInRuhe schrieb:

    C_KUNDENSTAMM_0 - Start Initialisation - 492
    C_KUNDENSTAMM_0 - Ende Initialisation - 690
    Ich denke, hier passiert das, weil da die Form bereits sichtbar ist.
    =====
    @Dksksm Du bekämpfst die Symptome, nicht aber die Ursachen.
    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!
    @RodFromGermany
    Die Form ist ab dem Acrivated-Event sichtbar:

    - Konstruktor-Start - 8
    C_KUNDENSTAMM - Konstruktor-Nach_InitializeComponent - 224
    C_KUNDENSTAMM - Objekt angelegt - 224
    C_KUNDENSTAMM_0 - Aufruf Show - 383
    C_KUNDENSTAMM_0 - Load - 427
    C_KUNDENSTAMM_0 - Activated - 481
    C_KUNDENSTAMM_0 - VisibleChanged - 501
    C_KUNDENSTAMM_0 - Shown - 510
    C_KUNDENSTAMM_0 - Start Initialisation - 510
    C_KUNDENSTAMM_0 - Ende Initialisation - 510

    Ich habe meine Methode zum Initialisieren auskommentiert und habe das gleiche Verhalten, wenn auch leicht verkürzt.

    Es läuft ab dem Show nichts außer dem Trace.


    @Dksksm
    Ich habe meine Form im Designer auf Opacity = 0 gestellt und setze diese im Shown-Event wieder auf 1. Sonst wird diese Einstellung nirgends verändert!
    Allerdings wird bei mir nach dem Load-Event das Activated-Event und eben dieses setzt mir die Form auf sichtbar -> Danach geht es ins Visiblechanged-Event.

    Hat noch jemand eine Idee? ?(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „LassMichInRuhe“ ()

    @LassMichInRuhe Mach Dir mal ne neue leere Form und übernimm dann schrittweise die Inhalte von der anderen
    oder Du kommentierst die Prozeduren aus und gibst sie wieder frei.
    In der Reihenfolge des Aufrufs.
    Irgendwann setzt dann Dein Effekt ein und Du hast ihn gefunden.
    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!
    @RodFromGermany
    Ich habe mir nun mal ein ganz neues Projekt erstellt und sehe das gleiche Phänomen.
    Das Projekt befindet sich im Anhang. ;)

    Wenn man das Fenster aufruft (MDIChild) blitzt dies zunächst grau auf und es sieht etwas seltsam aus.
    Bei meinem anderen Projekt dauert es ein paar Millisekunden länger, da sieht man es besser. Vermutlich sind mehrere Controls in den Tabsheets.

    Ich hätte halt -wie gesagt- gerne, dass das Fenster erst dann sichtbar wird, wenn es zu 100% fertig geladen ist.
    Das wird ja hoffentlich möglich sein. :rolleyes:

    Ich weiß, ist zwar ein Luxusproblem, aber es nervt mich X/
    Dateien
    • TestMe.zip

      (492,42 kB, 50 mal heruntergeladen, zuletzt: )
    @LassMichInRuhe Ich glaube zu wissen, was Du meinst.
    Von MDI war bisher nicht die Rede, na egal.
    Nach InitializeComponents() fügst Du ein:

    VB.NET-Quellcode

    1. Me.WindowState = Windows.Forms.FormWindowState.Minimized
    In TEST1_Shown fügst Du ein:

    VB.NET-Quellcode

    1. Me.WindowState = Windows.Forms.FormWindowState.Normal
    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!

    LassMichInRuhe schrieb:

    Wenn man das Fenster aufruft (MDIChild) blitzt dies zunächst grau auf und es sieht etwas seltsam aus.

    MDI.... da kannste das mit der Opacity schon mal knicken. Im Übrigen habe ich mit deinem Beispiel überhaupt gar keine Darstellungsfehler oder seltsame Effekte. Alles schön würde ich sagen.
    Nur verwende ich MDI nicht, hättest auch gleich schreiben können, dass es sich um ein MDIChild handelt.

    Zu spät, @RodFromGermany war schneller.