2009-11-06 9 views
16

Obecnie pracuję nad systemem menu do gry i mam standardową hierarchię ekranów i elementów ekranu. (Ekrany zawierają pewną kolekcję elementów ekranu). Chciałbym, aby elementy ekranu wysyłały zdarzenie do klasy ekranu, aby zadeklarować, że zostało wybrane. Jednak w tym przypadku nie potrzebuję żadnych argumentów o zdarzeniach. Nie jestem pewien, jaka jest składnia, aby utworzyć zdarzenie bez żadnych argumentów. Znalazłem rozwiązanie, które podaje indeks gracza jako argument zdarzenia. (Moja gra jest ściśle single-player, więc nie jest to konieczne.)C# Zdarzenia bez argumentów. Jak sobie z nimi radzić?

public event EventHandler<PlayerIndexEventArgs> Selected; 

^- Jak to zdarzenie jest zadeklarowana gdzie PlayerIndexEventArgs dziedziczy EventArgs. Czy mogę pominąć PlayerIndexEventArgs, czy jest tam domyślny typ, którego tutaj użyć, aby nie wysyłać żadnych argumentów? (Może po prostu klasa bazowa EventArgs?)

Odpowiedz

0

(Może po prostu klasa bazowa EventArgs?)

należy zrobić dokładnie to.

Od MSDN Docs na EventArgs:

Ta klasa nie zawiera żadnych danych o zdarzeniach; jest używany przez zdarzenia, które nie przekazują informacji o stanie do obsługi zdarzenia po wywołaniu zdarzenia.

8

Spróbuj:

public event EventHandler Selected; 

następnie zadzwonić ..

Selected(null, EventArgs.Empty); 

ten sposób jest to definicja domyślne zdarzenie i nie trzeba przechodzić żadnych informacji, jeśli nie chcą do.

+0

Ten facet naprawdę powinien używać zmiennych akcji, ponieważ są one mniej kłopotliwe i działają dobrze w większości przypadków. – RCIX

2

można po prostu napisać:

public event EventHandler Selected; 
0

Idąc od rodzaju PlayerIndexEventArgs pan wspomniał, ja zakładając używasz XNA, prawda? Jeśli tak, spójrz na próbkę Game State Management. Jeśli nie, kod może pomóc ci zrozumieć, jak to zrobić.

40

Możesz używać delegatów akcji. Jest to o wiele bardziej elegancko niż przy użyciu danych, których nigdy nie będziesz potrzebować (mam na myśli EventArgs).

Tutaj można zdefiniować zdarzenia:

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

a tu ogień zdarzenia:

EventWithoutParams(); 
EventWithIntParam(123); 

można znaleźć wszystkie potrzebne informacje na Action lub Action<T>.

Każde z tych zdarzeń może zostać zainicjowane przez delegata no-op ... = delegate { };, dzięki czemu nie trzeba sprawdzać wartości zerowej przed uruchomieniem zdarzenia.

+0

Inteligentny pomysł, nie ma pojęcia, dlaczego ludzie chcą robić całą niepotrzebną pracę wydarzeń tylko po to, aby marnować ich zalety! – RCIX

+4

Niestety, nie, po prostu wywołanie 'EventWithoutParams()' nie jest najlepszym sposobem na wystrzelenie zdarzenia. Powodem, jak wskazuje Eric Lippert, jest to, że możesz skończyć z wyjątkiem NullReferenceException. Musisz skopiować referencję delegata: 'Zdarzenie akcjiWithoutParamsTemp = EventWithoutParams;' a następnie wykonaj zerową kontrolę: 'if (eventWithoutParamsTemp! = Null) eventWithoutParamsTemp();' Reference: http://blogs.msdn.com/ ericlippert/archive/2009/04/29/events-and-races.aspx – jasonh

+1

Dzięki, jasonh, za komentarz. Pominąłem to, aby skoncentrować się na korzystaniu z delegata Akcji, a nie na poprawnym korzystaniu z wydarzeń. Myślałem, że wszyscy już wiedzą, jak używać wydarzeń. Jeśli nie, powinni przeczytać książkę Jefry Richtera. –

Powiązane problemy