Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para usar propiedades de evento, defina las propiedades de evento en la clase que genera los eventos y, a continuación, establezca los delegados para las propiedades de evento en las clases que controlan los eventos. Para implementar varias propiedades de evento en una clase, la clase debe almacenar y mantener internamente el delegado definido para cada evento. Para cada evento similar a un campo, se genera un tipo de referencia de campo de respaldo correspondiente. Esto puede provocar asignaciones innecesarias cuando aumenta el número de eventos. Como alternativa, un enfoque común es mantener un EventHandlerList que almacena los eventos por clave.
Para almacenar los delegados para cada evento, puede usar la EventHandlerList clase o implementar su propia colección. La clase de colección debe proporcionar métodos para establecer, acceder y recuperar el delegado del controlador de eventos en función de la clave de evento. Por ejemplo, podría usar una Hashtable clase o derivar una clase personalizada de la DictionaryBase clase . No es necesario exponer los detalles de implementación de la colección de delegados fuera de la clase.
Cada propiedad de evento dentro de la clase define un método de acceso "add" y un método de acceso "remove". El descriptor de acceso add para una propiedad de evento añade la instancia del delegado de entrada a la colección de delegados. El *remove* accessor de una propiedad de evento quita la instancia de delegado de entrada de la colección de delegados. Los accesores de propiedades de evento utilizan la clave predefinida de la propiedad de evento para agregar y quitar instancias en la colección de delegados.
Para controlar varios eventos mediante propiedades de evento
Defina una colección de delegados dentro de la clase que genera los eventos.
Defina una clave para cada evento.
Defina las propiedades del evento en la clase que genera los eventos.
Utiliza la colección de delegados para implementar los métodos accesores add y remove para las propiedades del evento.
Use las propiedades de eventos públicos para agregar y quitar delegados del controlador de eventos en las clases que controlan los eventos.
Ejemplo
En el siguiente ejemplo de C#, se implementan las propiedades de los eventos MouseDown y MouseUp, utilizando un EventHandlerList para almacenar el delegado de cada evento. Las palabras clave de las propiedades de eventos están en negrita.
// 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