2009-12-21 8 views
10

Estoy un poco confundido. Sé que puedo crear clases derivadas de EventArgs para tener datos de eventos personalizados. ¿Pero puedo emplear la clase base EventArgs de alguna manera? Al igual que el botón del mouse, haga clic en, en el método del suscriptor, siempre hay el parámetro "EventArgs e". ¿Puedo crear de alguna manera el método que pasará datos de esta manera, es decir, se aprobarán en la base Eventargs?¿Es posible pasar datos a EventArgs sin crear una clase derivada?

+0

Si está intentando cargar datos en un evento de clic del mouse, no solo no puede hacer esto, sino que indica que hay un problema con su diseño. – Will

+1

¿Alguna posibilidad de aclarar por qué esto es necesariamente un problema de diseño? ¿Puede un menú no ser visto semánticamente como una pila de botones, cuyo evento asociado le permite preguntar qué 'botón' realmente se presionó en el menú? ¿Qué principio de diseño está rompiendo al querer pasar información adicional junto con un clic de botón? – Patrick

Respuesta

3

¿Es posible usar simplemente el tipo de datos EventArgs raw? Absolutamente. De acuerdo con MSDN:

This class contains no event data; it is used by events that do not pass state information to an event handler when an event is raised. If the event handler requires state information, the application must derive a class from this class to hold the data.

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

private event TestEventEventHandler TestEvent; 
    private delegate void TestEventEventHandler(EventArgs e); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TestEvent += TestEventHandler; 
     if (TestEvent != null) 
     { 
      TestEvent(new EventArgs()); 
     } 
    } 
    private void TestEventHandler(EventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine("hi"); 
    } 

Si alguna vez hacerlo? No por alguna razón, puedo pensar si. Si desea crear sus propios clics que sólo puede crear una instancia del MouseEventArgs por su cuenta, también:

MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1); 
+4

También puede usar EventArgs.Empty http://msdn.microsoft.com/en-us/library/system.eventargs.empty.aspx – Gavin

+0

¿Es un error tipográfico? 'TestEventEventHandler'. Hay dos palabras de Evento. Pero en el código. Usaste 'TestEventHandler'. – Bigeyes

5

Nope. La clase base EventArgs es solo una manera de permitir algunos tipos de delegados de eventos estándar. En última instancia, para pasar datos a un controlador, tendrá que crear una subclase EventArgs. Podría usar el remitente arg en su lugar, pero ese debería ser realmente el objeto que disparó el evento.

13

Usted puede utilizar la clase EventArgs a través del enfoque de los tipos genéricos. En esta muestra, voy a utilizar la clase Rect con como tipo de retorno:

public EventHandler<Rect> SizeRectChanged; 

provocar el evento:

if(SizeRectChanged != null){ 
    Rect r = new Rect(0,0,0,0); 
    SizeRectChanged(this,r); 
} 

escuchar el evento:

anyElement.SizeRectChanged += OnSizeRectChanged; 

public void OnSizeRectChanged(object sender, Rect e){ 
    //TODO abything using the Rect class 
    e.Left = e.Top = e.Width = e.Height = 50; 
} 

Por lo tanto, no es necesario Para crear nuevas clases de eventos o delegados, simplemente cree un EventHandler que pase el tipo específico T.

+1

Esto parece incorrecto El [ejemplo de sitio web de MSDN] (http://msdn.microsoft.com/en-us/library/db0etb8x%28v=vs.110%29.aspx) muestra que Rect o TEventArg tienen que heredar de EventArgs. A menos que haya algo que esté malinterpretando. –

+1

Thomas, esto me pareció confuso también. Pero la sugerencia de jupi funcionó para mí. –

+0

Wow ... desearía haber sabido esto hace mucho tiempo. Siempre asumí que cuando declaró EventHandler , esa T debe derivar de EventArgs. Entonces, por ejemplo, si necesitaba enviar una cadena con mi evento, crearía una nueva clase StringEventArgs, que se subclasificó de EventArgs. El documento de MSDN vinculado por Thomas Lann ciertamente dice "Su segundo parámetro se deriva del tipo EventArgs y contiene los datos del evento", lo que implicaría para la mayoría de los lectores que no se puede usar ninguna clase arbitraria. Pero al compilador no parece importarle un EventHandler y esto funciona completamente bien hasta donde yo sé. – uglycoyote

Cuestiones relacionadas