Поделиться через


Практическое руководство. Обработка нескольких событий с помощью свойств события

Чтобы использовать свойства события, необходимо определить свойства события в классе, который вызывает события, а затем задать делегаты для свойств события в классах, обрабатывающих события. Чтобы реализовать несколько атрибутов событий в классе, класс должен хранить и управлять делегатом, определенным для каждого события. Для каждого события, аналогичного полю, создается соответствующий ссылочный тип резервного поля. Это может привести к ненужным выделениям при увеличении числа событий. В качестве альтернативы распространённым методом является поддержание EventHandlerList, который хранит события по ключу.

Для хранения делегатов для каждого события можно использовать EventHandlerList класс или реализовать собственную коллекцию. Класс коллекции должен предоставлять методы для установки, доступа и извлечения делегата обработчика событий на основе ключа события. Например, вы можете создать пользовательский класс на основе Hashtable класса или использовать класс DictionaryBase. Детали реализации коллекции делегатов не должны раскрываться за пределами вашего класса.

Каждое свойство события в классе определяет метод доступа и метод удаления доступа. Метод доступа add для свойства события добавляет входной экземпляр делегата в коллекцию делегатов. Средство доступа к удалению для свойства события удаляет входной экземпляр делегата из коллекции делегатов. Методы доступа к свойствам событий используют предопределенный ключ для свойства события, чтобы добавлять и удалять экземпляры из коллекции делегатов.

Обработка нескольких событий с помощью свойств события

  1. Определите коллекцию делегатов в классе, которая инициирует события.

  2. Определите ключ для каждого события.

  3. Определите свойства события в классе, который вызывает события.

  4. Используйте коллекцию делегатов для реализации методов добавления и удаления методов доступа для свойств события.

  5. Используйте свойства общедоступного события для добавления и удаления делегатов обработчика событий в классах, обрабатывающих события.

Пример

В следующем примере C# реализованы свойства события MouseDown и MouseUp, при помощи EventHandlerList хранится делегат каждого события. Ключевые слова конструкций свойств события выделены полужирным шрифтом.

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

См. также