2009-11-06 13 views
16

Actualmente estoy trabajando en un sistema de menú para un juego y tengo la jerarquía estándar para pantallas y elementos de pantalla. (Las pantallas contienen alguna colección de elementos de pantalla). Me gustaría que los elementos de la pantalla envíen un evento a la clase de pantalla para declarar que se ha seleccionado. Sin embargo, no necesito ningún argumento de evento en este caso. No estoy seguro de cuál es la sintaxis para crear el evento sin ningún argumento. Encontré una solución que pasa el índice del jugador como un argumento de evento. (Mi juego es estrictamente para un solo jugador, así que esto no es necesario.)C# Eventos sin argumentos. ¿Cómo los manejo?

public event EventHandler<PlayerIndexEventArgs> Selected; 

^- ¿Cómo se declara este evento donde PlayerIndexEventArgs hereda de EventArgs. ¿Puedo omitir PlayerIndexEventArgs, o hay un tipo predeterminado para usar aquí para enviar ningún argumento? (Tal vez sólo la clase base EventArgs?)

Respuesta

0

(Tal vez sólo la clase base EventArgs?)

Usted debe hacer exactamente eso.

Desde el MSDN Docs en EventArgs:

Esta clase no contiene datos de eventos; es utilizado por eventos que no pasan información de estado a un controlador de eventos cuando se produce un evento.

8

Probar:

public event EventHandler Selected; 

luego a llamar ..

Selected(null, EventArgs.Empty); 

De esta manera es la definición de eventos predeterminado y no se necesita para pasar cualquier información si no desea a.

+0

Este chico realmente debería estar utilizando las variables de acción ya que son menos complicadas y funcionan bien en la mayoría de los casos. – RCIX

2

Usted puede escribir:

public event EventHandler Selected; 
0

A juzgar por el tipo PlayerIndexEventArgs usted ha mencionado, estoy asumiendo que usted está utilizando XNA, ¿verdad? Si es así, eche un vistazo a la muestra Game State Management. De lo contrario, el código podría ayudarlo a comprender cómo hacerlo de todos modos.

40

Puede usar delegados Acción. Esto es mucho más elegante que utilizar datos que nunca necesitará (Me refiero a EventArgs).

Aquí se definen los eventos:

public event Action EventWithoutParams; 
public event Action<int> EventWithIntParam; 

Y aquí que el fuego eventos:

EventWithoutParams(); 
EventWithIntParam(123); 

se puede encontrar toda la información que necesita en Action o Action<T>.

Cualquiera de estos eventos se puede inicializar con un delegado no-operativo ... = delegate { }; para que no sea necesario comprobar el nulo antes de disparar el evento.

+0

¡Idea inteligente, no tiene idea de por qué la gente quiere hacer todo el trabajo innecesario de los eventos solo para desperdiciar sus ventajas! – RCIX

+4

Lamentablemente, no, simplemente llamar a 'EventWithoutParams()' no es la mejor manera de activar el evento. La razón, como señala Eric Lippert, es que puede terminar con una NullReferenceException. Lo que debe hacer es copiar la referencia de delegado: 'Action eventWithoutParamsTemp = EventWithoutParams;' y luego realizar una comprobación nula: 'if (eventWithoutParamsTemp! = Null) eventWithoutParamsTemp();' Referencia: http://blogs.msdn.com/ ericlippert/archive/2009/04/29/events-and-races.aspx – jasonh

+1

Gracias, jasonh, por tu comentario. He omitido esto para concentrarme en usar delegar Acción en sí mismo, no en el uso correcto de eventos. Pensé que todo el mundo ya sabía cómo usar eventos :) Si no, deberían leer el libro de Jefry Richter. –

Cuestiones relacionadas