Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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ń
Zdefiniuj w klasie kolekcję delegatów, która zgłasza zdarzenia.
Zdefiniuj klucz dla każdego zdarzenia.
Zdefiniuj właściwości zdarzenia w klasie, która zgłasza zdarzenia.
Użyj kolekcji delegatów, aby zaimplementować metody dodawania i usuwania metod dostępu dla właściwości zdarzenia.
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