Events weiterleiten

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

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

    Events weiterleiten

    Hallo Leute,
    In einem anderen Thread wurde mir einmal gesagt, ich solle alle Events einer Klasse an eine andere weiterleiten.
    Heißt in einer Klasse (hier: Stick) ist ein Event (Triggered) und dieses Event wird an eine andere Klasse weitergeleitet (Controller) ich möchte nun so darauf zugreifen:
    ...) Handles Controller.LeftStick.Triggered

    Für die Properties hat das so funktioniert:
    Controller-Klasse:

    VB.NET-Quellcode

    1. 'Stick
    2. ReadOnly Property LeftStick As Stick
    3. Get
    4. Return New Stick(ID, Key.LeftStick)
    5. End Get
    6. End Property
    7. ReadOnly Property RightStick As Stick
    8. Get
    9. Return New Stick(ID, Key.RightStick)
    10. End Get
    11. End Property


    Stick-Klasse:

    VB.NET-Quellcode

    1. Public ReadOnly Property Location As Windows.Vector
    2. Get
    3. Dim vector As New Windows.Vector
    4. ...
    5. Return vector
    6. End Get
    7. End Property
    8. Public ReadOnly Property IsPressed As Boolean
    9. Get
    10. Dim KeyPressed As Boolean
    11. ...
    12. Return KeyPressed
    13. End Get
    14. End Property


    mfG Frank


    Aus den Tipps & Tricks verschoben
    -Artentus

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

    xd-franky-5 schrieb:

    Events weiterleiten ?
    Indem Du beim Empfang eines Events das kommunizierende Event weiter-raisest.
    Also RaisEvent bla in die Eventhandler-Routine.
    Die Events musst Du natürlich passend einrichten.
    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!
    Hmm - was hat die Frage aus post#1 mit dem Code-Snippet aus post#1 zu tun?

    Jedenfalls das hier (aus post#1): "ich möchte nun so darauf zugreifen: Handles Controller.LeftStick.Triggered" geht nicht mit der Handles-Klausel.
    Hingegen mit AddHandler ist sowas möglich. Mehr dazu: Alles über Events

    (allerdings als "Weiterleiten eines Events" würde ich solch nicht bezeichnen)
    Ich zitiere aus dem Beitrag eines anderen Threads:


    Quellcode:
    [Controller]
    -LeftStick(Stick)
    -RightStick(Stick)
    -ButtonA(XbxButton)
    -ButtonB(XbxButton)
    -ButtonX(XbxButton)
    -ButtonY(XbxButton)
    -ControllCross(Cross)
    -MainXBoxButton(XbxButton)
    -SelectButton(XbxButton)
    -StarButton(XbxButton)
    -RT
    ...
    _Events_
    ControlTriggered

    [Stick]
    -Vector(System.Windows.Vector)
    -IsPressed(Boolean)
    ...
    _Events_(Friend)
    IsPushed
    IsTriggered

    [XbxButton]
    -IsPressed(Boolean)
    ...
    _Events_(Friend)
    IsPushed

    Und in der Controllerklasse leitest du alle untergeordneten Events nach oben weiter.


    Ich hab's mal mit AddHandler versucht, geht aber nicht.

    Wegen den Snippets: So konnte ich Properties weiterleiten
    @ErfinderDesRades
    Ja hab' ich.

    Ich hab' mein Problem aber leider nicht lösen können, so kann ich es nun aufrufen:

    VB.NET-Quellcode

    1. Private Sub LeftStick_IsTriggered() Handles Controller.LeftStickIsTriggered

    Ich weiß wie man den AddHandler eigentlich verwendet aber ich vestehe nicht wie ich dann zu dem hier komme:

    VB.NET-Quellcode

    1. Private Sub LeftStick_IsTriggered() Handles Controller.LeftStick.IsTriggered


    Denn LeftStick ist ja eine Property

    Das Problem ist jetzt nur beim Konstruktor von der Klasse Stick, wird ein Timer gestartet, der immer nach den Daten des Sticks schaut und das Event bei Veränderung aufruft. Aber da dabei öfters dieser Timer gestartet wird, steigt der CPU schnell auf 30°. Wie kann ich das besser lösen ?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xd-franky-5“ ()

    Du musst in der Controller-Klasse ein Event "LeftStickIsTriggered" haben und das "IsTriggered"-Event des LeftSticks abonnieren. Beim Handler des IsTriggered-Events das "LeftStickIsTriggered" raisen, und das kannst du dann von außerhalb abbonieren.
    Wurde aber auch schon gesagt.

    EDIT: Und du sagtest, es funktioniert auch schon. Sry. Aber was ist noch das Problem ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Handles KLausel wegmachen, und Irgendwo ausserhalb von LeftStick_IsTriggeredmuss folgende Zeile einmal durchaufen werden:

    VB.NET-Quellcode

    1. AddHandler Controller.LeftStick.IsTriggered, Addressof LeftStick_IsTriggered

    Aber nur einmal!! Denn sonst wird die Methode immer doppelt aufgerufen.




    Was mit deinem Konstruktor ist, können wir natürlich nicht wissen.