Dropdownliste schließen bei "komplette Dropdownliste.Mouseleave"

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Hanuta.

    Dropdownliste schließen bei "komplette Dropdownliste.Mouseleave"

    Hi,
    ich verzweifle: Ich habe ein Toolstrip mit mehreren Splitbuttons, die wiederum haben ein Untermenu.
    Es gibt eine Sub, die bei einem splitbutton.mouseenter die dropdownlist anzeigt.

    Jetzt möchte ich diese Liste aber schließen, sobald ich die geöffnete Liste verlasse.
    Ein "splitbutton.mouseleave" geht ja nicht, dann schließt er, sobald ich den Splitbutton verlasse. Er soll aber halt erst schließen, wenn die Maus über keinem Untermenupunkt mehr ist.
    Habt ihr da Ideen?

    https://www.vb-paradise.de/index.php/Thread/61056-Control-Befindet-sich-die-Maus-%C3%BCber-dem-Control/

    hilft mir ja nicht weiter, es gibt m.M.n. keine Möglichkeit ein Toolstripmenuitem als Control zu casten, stimmts?!

    Danke für Ideen, CU
    Brauch' ich die?
    @Hanuta Vielleicht anders herum:
    Das Leave für ein Control ist mit dem Enter eines anderen Controls verbunden.
    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!
    Ich hab nen Weg gefunden. Er enthält wahrscheinlich noch von mir unerkannte Tücken, aber für den Anfang läuft's:

    VB.NET-Quellcode

    1. Private CloseMenu As Boolean = True
    2. Private Sub ToolStripDropDownButton1_MouseEnter(sender As Object, e As EventArgs) Handles ToolStripDropDownButton1.MouseEnter
    3. ToolStripDropDownButton1.ShowDropDown()
    4. CloseMenu = False
    5. End Sub
    6. Private Sub TsiSubButtons_MouseLeave(sender As Object, e As EventArgs) Handles TsiFirstSubButton.MouseLeave, TsiSecondSubButton.MouseLeave
    7. CloseMenu = True
    8. SoonCloseMenu()
    9. End Sub
    10. Private Sub TsiSubButtons_MouseEnter(sender As Object, e As EventArgs) Handles TsiFirstSubButton.MouseEnter, TsiSecondSubButton.MouseEnter
    11. CloseMenu = False
    12. End Sub
    13. Private Async Sub SoonCloseMenu()
    14. Await Threading.Tasks.Task.Delay(100)
    15. If CloseMenu Then ToolStripDropDownButton1.HideDropDown()
    16. End Sub
    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.

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

    @RodFromGermany
    Hilf mir bitte auf die Sprünge, ich glaube ich stehe auf dem Schlauch.
    Wenn ich ein Control leave, bedeutet es ja nicht zwangsweise, dass ich das andere entere. Es kann ja auch sein dass ich das komplette TSMI verlasse, wobei dann ja das hidedropdown eintreten soll

    @VaporiZed
    Ja, das schaut schon sehr gut aus. Es geht im meinem Fall um eine ganze Batterie von Controls, teils dynamisch erstellt. Wenn ich Dein Closemenu als Tag ins jeweilige Control setze, müsste es ja eigentlich funzen.
    Du hast mir da aber noch etwas anderes gezeigt:
    Await Threading.Tasks.Task.Delay(100)
    Sehe ich das richtig, dass der nachfolgende Code erst nach 100ms ausgeführt wird? Ist das auch die Lösung für Problem, wenn ich bei einem einzigen Button sowohl click als auch doubleclick benutzen will?!?!
    Brauch' ich die?

    Hanuta schrieb:

    Wenn ich ein Control leave, bedeutet es ja nicht zwangsweise, dass ich das andere entere.
    Nicht "das andere" sondern "ein anderes".
    Ansonsten hat jemand die Maus rausgezogen.
    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!
    Du meinst also z.b. das übergeordnete Panel, was meine TSMI beinhaltet?
    panel.mouseenter=tsmi.hidedropdown?

    Schon probiert, geht leider nicht da das TSMI noch aktiv ist. Panel.mouseenter wird gar nicht ausgelöst solange das TSMI-Dropdown offen ist.
    Brauch' ich die?

    Hanuta schrieb:

    Sehe ich das richtig, dass der nachfolgende Code erst nach 100ms ausgeführt wird?
    Das liegt daran, dass erst bei dem einen Item das Leave-Ereignis gefeuert wird (was ohne Verzögerung zum Schließen des Menüs führen würde) und dann erst das Enter-Ereignis des nächsten. Sicherlich gehen auch weniger Millisekunden. Musste probieren.
    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.
    Nope, es führt dazu, dass andere Dinge abgearbeitet werden können und nach 100 ms geht es eben in der nächsten Zeile weiter.
    Stichwort Async/Await
    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.