2009-11-06 5 views
16

Je travaille actuellement sur un système de menu pour un jeu et j'ai la hiérarchie standard pour les écrans et les éléments d'écran. (Les écrans contiennent une collection d'éléments d'écran). Je voudrais que les éléments d'écran envoient un événement à la classe d'écran pour déclarer qu'il a été sélectionné. Cependant, je n'ai besoin d'aucun argument d'événement dans ce cas. Je ne suis pas sûr de la syntaxe pour créer l'événement sans arguments. J'ai trouvé une solution qui passe l'index du joueur comme un argument d'événement. (Mon jeu est strictement solo, donc ce n'est pas nécessaire.)C# Événements sans arguments. Comment puis-je les gérer?

public event EventHandler<PlayerIndexEventArgs> Selected; 

^- Comment cet événement est déclaré où PlayerIndexEventArgs hérite de EventArgs. Puis-je omettre PlayerIndexEventArgs, ou existe-t-il un type par défaut à utiliser ici pour envoyer aucun argument? (Peut-être juste la? Classe de base EventArgs)

Répondre

0

(Peut-être que la classe de base EventArgs?)

Vous devriez faire exactement.

Depuis le MSDN Docs EventArgs:

Cette classe ne contient aucune donnée d'événement; Il est utilisé par les événements qui ne transmettent pas les informations d'état à un gestionnaire d'événements lorsqu'un événement est déclenché.

8

Essayez:

public event EventHandler Selected; 

puis appeler ..

Selected(null, EventArgs.Empty); 

De cette façon, il est la définition d'événement par défaut et vous n'avez pas besoin de passer des informations si vous ne voulez pas à.

+0

Ce gars devrait vraiment utiliser les variables Action car elles sont moins compliquées et fonctionnent très bien dans la plupart des cas. – RCIX

2

Vous pouvez simplement écrire:

public event EventHandler Selected; 
0

Aller par le type PlayerIndexEventArgs vous avez mentionné, je suppose que vous utilisez XNA, non? Si oui, jetez un oeil à l'échantillon Game State Management. Si ce n'est pas le code peut vous aider à comprendre comment le faire quand même.

40

Vous pouvez utiliser les délégués Action. C'est beaucoup plus élégant que d'utiliser des données dont vous n'aurez jamais besoin (je veux dire EventArgs).

Vous définissez ici les événements:

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

Et vous le feu des événements:

EventWithoutParams(); 
EventWithIntParam(123); 

Vous pouvez trouver toutes les informations dont vous avez besoin à Action ou Action<T>.

L'un ou l'autre de ces événements peut être initialisé avec un délégué ... = delegate { }; de sorte que vous n'avez pas besoin de vérifier null avant de déclencher l'événement.

+0

idée intelligente, n'ont aucune idée pourquoi les gens veulent faire tout le travail inutile des événements que de gaspiller leurs avantages! – RCIX

+4

Malheureusement, non, simplement appeler 'EventWithoutParams()' n'est pas la meilleure façon de déclencher l'événement. La raison, comme le souligne Eric Lippert, est que vous pouvez vous retrouver avec une exception NullReferenceException. Ce que vous devez faire est de copier la référence du délégué: 'Action eventWithoutParamsTemp = EventWithoutParams;' et ensuite effectuer une vérification null: 'if (eventWithoutParamsTemp! = Null) eventWithoutParamsTemp();' Référence: http://blogs.msdn.com/ ericlippert/archive/2009/04/29/events-and-races.aspx – jasonh

+1

Merci, jasonh, pour votre commentaire. J'ai omis cela afin de me concentrer sur l'utilisation du délégué Action lui-même, et non sur l'utilisation correcte des événements. Je pensais que tout le monde savait déjà comment utiliser les événements :) Sinon, ils devraient lire le livre de Jefry Richter. –

Questions connexes