Udostępnij za pośrednictwem


Instrukcje: obsługa wielu zdarzeń przy użyciu właściwości zdarzenia

Aby użyć właściwości zdarzenia, należy zdefiniować właściwości zdarzenia w klasie, która zgłasza zdarzenia, a następnie ustawić delegatów dla właściwości zdarzenia w klasach obsługujących zdarzenia. Aby zaimplementować wiele własności zdarzeń w klasie, klasa powinna wewnętrznie przechowywać i obsługiwać zdefiniowanego delegata dla każdego zdarzenia. Dla każdego zdarzenia przypominającego pole jest generowany odpowiedni typ odwołania do pola zapasowego. Może to prowadzić do niepotrzebnych alokacji w przypadku wzrostu liczby zdarzeń. Zamiast tego typowym podejściem jest prowadzenie EventHandlerList w celu przechowywania zdarzeń według klucza.

Aby przechowywać delegatów dla każdego zdarzenia, możesz użyć EventHandlerList klasy lub zaimplementować własną kolekcję. Klasa kolekcji musi udostępniać metody umożliwiające ustawianie, dostęp i pobieranie delegata obsługi zdarzeń na podstawie klucza zdarzenia. Można na przykład użyć Hashtable klasy lub uzyskać niestandardową klasę DictionaryBase z klasy . Szczegóły implementacji kolekcji delegatów nie muszą być ujawniane na zewnątrz Twojej klasy.

Każda właściwość zdarzenia w klasie definiuje metodę dodawania metody dostępu i metodę usuwania metody dostępu. Akcesor dodawania dla właściwości zdarzenia dodaje instancję delegata wejściowego do kolekcji delegatów. Usunięcie metody dostępu dla właściwości zdarzenia usuwa wystąpienie delegata wejściowego z kolekcji delegatów. Metody dostępu właściwości zdarzenia używają wstępnie zdefiniowanego klucza dla właściwości zdarzenia, aby dodawać i usuwać wystąpienia z kolekcji delegatów.

Aby obsłużyć wiele zdarzeń przy użyciu właściwości zdarzeń

  1. Zdefiniuj w klasie kolekcję delegatów, która zgłasza zdarzenia.

  2. Zdefiniuj klucz dla każdego zdarzenia.

  3. Zdefiniuj właściwości zdarzenia w klasie, która zgłasza zdarzenia.

  4. Użyj kolekcji delegatów, aby zaimplementować metody dodawania i usuwania metod dostępu dla właściwości zdarzenia.

  5. Użyj właściwości publicznych zdarzeń, aby dodać i usunąć delegatów obsługi zdarzeń w klasach obsługujących zdarzenia.

Przykład

Poniższy przykład w języku C# implementuje właściwości zdarzenia MouseDown i MouseUp oraz używa elementu EventHandlerList do przechowywania delegata dla każdego zdarzenia. Słowa kluczowe dotyczące właściwości zdarzenia są pogrubione.

// 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

Zobacz także