Delen via


Procedure: Meerdere gebeurtenissen afhandelen met gebeurteniseigenschappen

Als u gebeurteniseigenschappen wilt gebruiken, definieert u de gebeurteniseigenschappen in de klasse die de gebeurtenissen genereert en stelt u vervolgens de gemachtigden in voor de gebeurteniseigenschappen in klassen die de gebeurtenissen verwerken. Als u meerdere gebeurteniseigenschappen in een klasse wilt implementeren, moet de klasse intern de gedelegeerde opslaan en onderhouden die voor elke gebeurtenis is gedefinieerd. Voor elke veldachtige gebeurtenis wordt een bijbehorend verwijzingstype voor backing-velden gegenereerd. Dit kan leiden tot onnodige toewijzingen wanneer het aantal gebeurtenissen toeneemt. Als alternatief is het onderhouden van gebeurtenissen EventHandlerList op basis van de sleutel een algemene benadering.

Als u de gemachtigden voor elke gebeurtenis wilt opslaan, kunt u de EventHandlerList klasse gebruiken of uw eigen verzameling implementeren. De verzamelingsklasse moet methoden bieden voor het instellen, openen en ophalen van de gemachtigde van de gebeurtenishandler op basis van de gebeurtenissleutel. U kunt bijvoorbeeld een Hashtable klasse gebruiken of een aangepaste klasse afleiden uit de DictionaryBase klasse. De implementatiedetails van de verzameling gedelegeerden hoeven niet buiten uw klas beschikbaar te worden gesteld.

Elke gebeurteniseigenschap in de klasse definieert een methode voor add accessor en een methode voor het verwijderen van toegangsrechten. De add accessor voor een gebeurteniseigenschap voegt het exemplaar van de invoerdelegen toe aan de gedelegeerdeverzameling. Met de toegangsbeheer voor een gebeurteniseigenschap wordt het exemplaar van de invoerdelegen verwijderd uit de verzameling gedelegeerden. De gebeurteniseigenschapstoegangsors gebruiken de vooraf gedefinieerde sleutel voor de gebeurteniseigenschap om exemplaren toe te voegen en te verwijderen uit de gedelegeerde verzameling.

Meerdere gebeurtenissen afhandelen met gebeurteniseigenschappen

  1. Definieer een verzameling gemachtigden binnen de klasse die de gebeurtenissen genereert.

  2. Definieer een sleutel voor elke gebeurtenis.

  3. Definieer de gebeurteniseigenschappen in de klasse die de gebeurtenissen genereert.

  4. Gebruik de verzameling gemachtigden om de toegangsmethoden voor toevoegen en verwijderen voor de gebeurteniseigenschappen te implementeren.

  5. Gebruik de eigenschappen van openbare gebeurtenissen om gedelegeerden van gebeurtenishandlers toe te voegen en te verwijderen in de klassen die de gebeurtenissen verwerken.

Opmerking

In het volgende C#-voorbeeld worden de gebeurteniseigenschappen MouseDown geïmplementeerd en MouseUpwordt er een gebruikt EventHandlerList om de gedelegeerde van elke gebeurtenis op te slaan. De trefwoorden van de gebeurteniseigenschapsconstructies zijn vetgedrukt.

// The class SampleControl defines two event properties, MouseUp and MouseDown.
ref class SampleControl : Component
{
    // :
    // Define other control methods and properties.
    // :

    // Define the delegate collection.
protected:
    EventHandlerList^ listEventDelegates;

private:
    // Define a unique key for each event.
    static Object^ mouseDownEventKey = gcnew Object();
    static Object^ mouseUpEventKey = gcnew Object();

    // Define the MouseDown event property.
public:
    SampleControl()
    {
        listEventDelegates = gcnew EventHandlerList();
    }

    event MouseEventHandler^ MouseDown
    {
        // Add the input delegate to the collection.
        void add(MouseEventHandler^ value)
        {
            listEventDelegates->AddHandler(mouseDownEventKey, value);
        }
        // Remove the input delegate from the collection.
        void remove(MouseEventHandler^ value)
        {
            listEventDelegates->RemoveHandler(mouseDownEventKey, value);
        }
        // Raise the event with the delegate specified by mouseDownEventKey
        void raise(Object^ sender, MouseEventArgs^ e)
        {
            MouseEventHandler^ mouseEventDelegate =
                (MouseEventHandler^)listEventDelegates[mouseDownEventKey];
            mouseEventDelegate(sender, e);
        }
    }

    // Define the MouseUp event property.
    event MouseEventHandler^ MouseUp
    {
        // Add the input delegate to the collection.
        void add(MouseEventHandler^ value)
        {
            listEventDelegates->AddHandler(mouseUpEventKey, value);
        }
        // Remove the input delegate from the collection.
        void remove(MouseEventHandler^ value)
        {
            listEventDelegates->RemoveHandler(mouseUpEventKey, value);
        }
        // Raise the event with the delegate specified by mouseUpEventKey
        void raise(Object^ sender, MouseEventArgs^ e)
        {
            MouseEventHandler^ mouseEventDelegate =
                (MouseEventHandler^)listEventDelegates[mouseUpEventKey];
            mouseEventDelegate(sender, e);
        }
    }
};
// The class SampleControl defines two event properties, MouseUp and MouseDown.
class SampleControl : Component
{
    // :
    // Define other control methods and properties.
    // :

    // Define the delegate collection.
    protected EventHandlerList listEventDelegates = new EventHandlerList();

    // Define a unique key for each event.
    static readonly object mouseDownEventKey = new object();
    static readonly object mouseUpEventKey = new object();

    // Define the MouseDown event property.
    public event MouseEventHandler MouseDown
    {
        // Add the input delegate to the collection.
        add
        {
            listEventDelegates.AddHandler(mouseDownEventKey, value);
        }
        // Remove the input delegate from the collection.
        remove
        {
            listEventDelegates.RemoveHandler(mouseDownEventKey, value);
        }
    }

    // Raise the event with the delegate specified by mouseDownEventKey
    private void OnMouseDown(MouseEventArgs e)
    {
        MouseEventHandler mouseEventDelegate =
            (MouseEventHandler)listEventDelegates[mouseDownEventKey];
        mouseEventDelegate(this, e);
    }

    // Define the MouseUp event property.
    public event MouseEventHandler MouseUp
    {
        // Add the input delegate to the collection.
        add
        {
            listEventDelegates.AddHandler(mouseUpEventKey, value);
        }
        // Remove the input delegate from the collection.
        remove
        {
            listEventDelegates.RemoveHandler(mouseUpEventKey, value);
        }
    }

    // Raise the event with the delegate specified by mouseUpEventKey
    private void OnMouseUp(MouseEventArgs e)
    {
        MouseEventHandler mouseEventDelegate =
            (MouseEventHandler)listEventDelegates[mouseUpEventKey];
        mouseEventDelegate(this, e);
    }
}
' The class SampleControl defines two event properties, MouseUp and MouseDown.
Class SampleControl
    Inherits Component
    ' :
    ' Define other control methods and properties.
    ' :

    ' Define the delegate collection.
    Protected listEventDelegates As New EventHandlerList()

    ' Define a unique key for each event.
    Shared ReadOnly mouseDownEventKey As New Object()
    Shared ReadOnly mouseUpEventKey As New Object()

    ' Define the MouseDown event property.
    Public Custom Event MouseDown As MouseEventHandler
        ' Add the input delegate to the collection.
        AddHandler(Value As MouseEventHandler)
            listEventDelegates.AddHandler(mouseDownEventKey, Value)
        End AddHandler
        ' Remove the input delegate from the collection.
        RemoveHandler(Value As MouseEventHandler)
            listEventDelegates.RemoveHandler(mouseDownEventKey, Value)
        End RemoveHandler
        ' Raise the event with the delegate specified by mouseDownEventKey
        RaiseEvent(sender As Object, e As MouseEventArgs)
            Dim mouseEventDelegate As MouseEventHandler = _
                listEventDelegates(mouseDownEventKey)
            mouseEventDelegate(sender, e)
        End RaiseEvent
    End Event

    ' Define the MouseUp event property.
    Public Custom Event MouseUp As MouseEventHandler
        ' Add the input delegate to the collection.
        AddHandler(Value As MouseEventHandler)
            listEventDelegates.AddHandler(mouseUpEventKey, Value)
        End AddHandler
        ' Remove the input delegate from the collection.
        RemoveHandler(Value As MouseEventHandler)
            listEventDelegates.RemoveHandler(mouseUpEventKey, Value)
        End RemoveHandler
        ' Raise the event with the delegate specified by mouseDownUpKey
        RaiseEvent(sender As Object, e As MouseEventArgs)
            Dim mouseEventDelegate As MouseEventHandler = _
                listEventDelegates(mouseUpEventKey)
            mouseEventDelegate(sender, e)
        End RaiseEvent
    End Event
End Class

Zie ook