Problem bei Abfrage "Enter" in einer Textbox + zus. Messagebox

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

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Problem bei Abfrage "Enter" in einer Textbox + zus. Messagebox

    Hallo Leute.

    Folgende Situation: Einer Textbox wurde ein AttachedProperty angehangen. Hier ist das "KeyUp"-Event aboniert und abegfragt, ob es sich um die Enter-Taste handelt. Die löst dann eine Funktion aus. Soweit alles gut.

    VB.NET-Quellcode

    1. AddHandler TB.KeyUp, Sub(sender As Object, EA As KeyEventArgs)
    2. If EA.Key = Key.Enter Then
    3. Dim DC = DirectCast(TB.DataContext, Fotoanzeige_Code)
    4. Console.WriteLine(TB.IsFocused.ToString)
    5. Console.WriteLine(TB.IsKeyboardFocused.ToString)
    6. DC.Umbenennen()
    7. End If
    8. End Sub


    Problem: Die Funktion ruft u.U. eine Messagbox auf. Bestätigt man die nun mit Enter, löst das Event in der Textbox im Hauptfenster erneut aus. Nun war mein Gedanke durch eine Abfrage, ob der Fukos bzw. Keyboardfokus aktuell auf der Textbox im Hauptfenster liegt oder eben nicht. Leider sind beide Werte "True", auch wenn gerade die Messagebox angezeigt wird.
    Wie verhindert man nun die Auslösung des Events, wenn die Messagebox offen ist? Oder muss man tatsächlich vorm Aufruf erst den Fokus von der Textbox nehmen und später wieder setzen?

    Gruß
    eddi
    Probier es mit KeyDown.
    Zum anderen sollten EventHandler, die mit AddHandler abonniert wurde, am Ende mit RemoveHandler wieder deabonniert werden.
    Das Problem: Das klappt mit anonymen Methoden nicht.

    Somit:

    VB.NET-Quellcode

    1. Private Sub DeinTextBoxKeyDownEventHandler(sender As Object, e As KeyEventArgs)
    2. If e.Key <> Key.Enter Then Return
    3. Dim DC = DirectCast(TB.DataContext, Fotoanzeige_Code)
    4. Console.WriteLine(TB.IsFocused.ToString)
    5. Console.WriteLine(TB.IsKeyboardFocused.ToString)
    6. DC.Umbenennen()
    7. End Sub
    8. '…
    9. AddHandler TB.KeyUp, AddressOf DeinTextBoxKeyDownEventHandler
    10. '…
    11. RemoveHandler TB.KeyUp, AddressOf DeinTextBoxKeyDownEventHandler

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @eichseinet Du kannst vor dem Aufruf der MessaeBox ein Fla setzen und dies im Eventhandler abfragen, zurücksetzen und returnen
    oder
    .Umbenennen() weiß ebenfalls per Flag, dass schon umbenannt wurde.
    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 euch beiden.
    @VaporiZed: Das Event wieder zu deabonieren macht hier eigentlich keinen Sinn. In die Textbox wird immer wieder der neue Name eingegeben und mit Enter die Funktion zum Umbenennen der Datei aufgerufen und danach automatisch die nächste Dstei geladen.
    @RodFromGermany: Dann werd ich's wohl doch so lösen. Der Weg über eine extra Variable zum Sperren kam mir einfach zu "unprofessionell" und gebastelt vor. Daher wollte ich hier mal fragen, wie Leute machen, die sich etwas besser auskennen als ich.

    Vielen Dank und Gruß
    eddi
    Ich habe nicht gemeint, dass man sofort nach dem Abonnieren wieder deabonniert.
    Man abonniert, bevor man es das erste Mal braucht und deabonniert normalerweise bei Programmende. Sonderszenarien ausgenommen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    eichseinet schrieb:

    Ist das bei Programmende denn noch interessant?
    Nein.
    Da wird eh der gesamte von der App genutzte Speicher leergeräumt.
    Und:
    Flags sind eine ganz normale Sache.
    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!