UserControl MouseLeave Problem wenn Usercontrol an dreis Seiten keinen freien Rand hat

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

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

    UserControl MouseLeave Problem wenn Usercontrol an dreis Seiten keinen freien Rand hat

    Hallo allerseits,

    ich habe ein uC wie angefügt erstellt. Die PicBox hat oben, rechts und links keinen Rand zum uC.

    Ich hätte gerne eine MouseLeave für das Usercontrol.
    Da die Picturebox aber an drei Seiten randlos sitzt, wird das MouseEnter des uC nie getriggert, wenn man von rechts, links oder oben kommt. Entsprechend kommt das MouseLeave auch nie.

    Das MouseLeave der PicBox kann ich nicht nehmen, weil das Event beim Übergang zu den beiden Buttons darunter ausgelöst würde, das aber explizit nicht gewünscht ist.

    Uff. Ist das überhaupt lösbar

    Vielen Dank und schönes Wochenende

    John
    Bilder
    • uc.png

      6,09 kB, 400×600, 70 mal angesehen
    @John422 Probier mal das Leave-Event und werte ggf. die Maus-Koordinaten aus, um es durchzureichen.
    Nimm diese Variante (Pseudocode):

    Quellcode

    1. Protected Overloads OnLeave(...)
    2. If Maus.Irgendwas Then
    3. MyBase.[/vbnet][vbnet]OnLeave(...)
    4. End If
    5. 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!

    John422 schrieb:

    Uff. Ist das überhaupt lösbar
    Schwierig.

    Das Problem ist, dass auf dem UserControl was drauf liegt - wo die MouseEvents ja alle nicht durch-dringen.
    Ich hab sowas schon mit einem Timer gelöst, der geguckt hat, ob die Maus noch in dem und dem Bereich.
    Oder mit WndProc - Überschreibung.
    Auf jeden Fall ein ziemliches Gehampel.
    wäre es nicht möglich die Picturebox je 2 Pixel nach innen zu setzen ? Dann wäre die maus ja theoretisch immer kurz auf dem UserControl selbst, bevor die Maus das UC verlässt ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    theoretisch
    theoretisch ja, wenn die Maus sehr schnell bewegt wird, nicht unbedingt.
    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 habe es nun so gelöst:

    Ein 300mS Timer löst mein Ereignsi aus.

    - MouseLeave der PicBox: Timer.Enabled=True
    - MouseEnter der PicBox: Timer.Enabled=False

    - MouseEnter der Buttons: Timer.Enabled=False
    - MouseLeave der Buttons: Timer.Enabled=True

    Funktionert.

    Was ich überhaupt gar nicht verstehe: Wieso funktioniert auch das MouseLeave Event meines UserControls auf dem Form nicht? Was weiß denn das Form davon, daß es auf meinem uC eine Picbox gibt? Zählt für die Events auf dem Form nicht immer das UserControl als ganzes?!?

    John

    John422 schrieb:

    Wieso funktioniert auch das MouseLeave Event meines UserControls auf dem Form nicht?
    Ich verstehe den Sinn dieser Frage nicht.
    Das UserControl wirft ein Event.
    Ein Parent, das dieses Event abonniert hat, wird beim Werfen des Events benachrichtigt.
    Hat niemand dieses Event abonniert, wird auch niemand benachrichtigt.
    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 es etwas ungünstig ausgedrückt, bin aber im Wesentlichen hier rüber gestolpert.
    UserControl - ein zentrales MouseEnter / MouseLeave Event ?

    ...ist für mich auch nicht einsichtig, wieso nicht unabhängig von den Steuerelementen, die in meinem uC enthalten sind immer gegenüber dem Parent Form ein MouseLeave für das gesamte Control geworfen wird.
    Was interessiert es das Form, was innen in meinem Control los ist, wenn die Elemente drinnen private sind?!?

    John422 schrieb:

    Was interessiert es das Form
    Wenn es die Form nicht interessiert, dann abonniere es nicht.
    Es gibt sehr viele Events, die Du nicht abonnierst. ;)
    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 das ist nicht der Punkt.

    Die Buttons in meinem uC sind Private. Trotzdem löst der Wechsel der Maus innerhalb des uC vom uC auf den Button ein MouseLeave gegenüber dem Form aus, sofern das Form MouseLeave aboniert hat und das fidne ich mindestens verwirrend. Das Form kennt nur das uC als solches und sollte von privatem im inneren nicht Wissen.

    Anderes Beispiel.
    Ein Form bekommt doch von einem Listview auch kein MouseLeave, wenn der User innerhalb des Listviews vom Listenbreich in den Spaltenkopf wechselt.
    @John422 Das kann ich mir nicht so recht vorstellen.
    Mach ein neues Projekt, in dem dieser Effekt reproduziert wird. Bereinige dieses Projekt (keine obj, bin, .vs-Ordner), zippe es und hänge es an:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    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!

    John422 schrieb:

    Zählt für die Events auf dem Form nicht immer das UserControl als ganzes?!?
    Scheinbar nicht (also ich habs nicht überprüft, was du sagst, aber wenn stimmt was du sagst dann isses so)

    John422 schrieb:

    Anderes Beispiel.
    Ein Form bekommt doch von einem Listview auch kein MouseLeave, wenn der User innerhalb des Listviews vom Listenbreich in den Spaltenkopf wechselt.
    Jo, ein ListView ist ein Control, und ein UserControl ist ein UserControl.
    Dieser Unterschied kann das schon ausmachen.
    Weil die Maus dann nicht mehr über dem UserControl ist, sondern über Button1.

    Deshalb kommt in Umkehrung ja auch das .MouseEnter, wenn die Maus den Button1 wieder verlässt und dann wieder über dem UserControl steht.

    Ja, so ist das eben. Danke für die Wissens-Auffrischung (ich hatte ja in Erinnerung, dass das iwie schwierig war, aber das ist genau das Problem auffm Punkt - wenn man UserControl.Leave braucht, was analog zum ListView.Leave tickt).

    John422 schrieb:

    Trotzdem löst der Wechsel der Maus innerhalb des uC vom uC auf den Button ein MouseLeave gegenüber dem Form aus,
    ist ein anderer Sachverhalt.
    Einmal empfängt ein Control innerhalb eines UserControls das Event, einmal das Parent des UserControls.
    Innerhalb des UserControls ist das in Ordnung, vom UserControl zu seinem Parent nicht.
    ======
    Das Verhalten ist völlig korrekt.
    Das UserControl meldet seinem Parent, wenn Enter bzw. Leave eintritt.
    Woher das Enter und wohin das Leave geht, spielt dabei keine Rolle.
    Es ist also alles in Ordnung.
    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!

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