Press "Enter" to skip to content

Dzień: 2014-01-06

[c#] Zdarzenia – ostatni z konkursowych

Zdarzenia są wywoływane, jeżeli coś konkretnego stanie się w trakcie działania naszego programu. Akcją wywołującą je może być osiągnięcie przez zmienną pewnej wartości, przejście wykonania programu do określonego bloku, użycie mechanizmu drag and drop, lub chociażby kliknięcie na przycisk lub najechanie myszką na dane pole na ekranie. To właśnie dzięki zdarzeniom dany obiekt może poinformować inny (który dane publiczne zdarzenie obsługuje) o zmianie swojego stanu. Klasa naszego obiektu może mieć bardzo wiele zdarzeń, które są wywoływane po zaistnieniu ściśle określonego warunku (jak zakończenie pobierania pliku, przyciśnięcie przycisku czy ustawienie zmiennej w setterze). Użytkownik pisząc w Visual Studio często sobie takie zdarzenia „wyklikiwał” projektując interfejs – na przykład przeciągał z toolboxa kontrolkę typu button, nadając jej nazwę, a następnie klikając na nią 2 razy. Po takiej operacji został wygenerowany następujący kod:

 
private void button1_Click(object sender, RoutedEventArgs e)
        {
            
        }

Jak widać funkcją obsługującą zdarzenie jest (i musi być) funkcja, która nie zwraca wartości, a pobiera obiekt, który wywoła zdarzenie, oraz obiekt typu EventArgs. W przykładzie powyżej mamy obiekt typu RoutedEventArgs. Najeżdżając na nazwę tego typu i po wciśnięciu F12 możemy zobaczyć taki fragment kodu public class RoutedEventArgs : EventArgs .
Jak widzimy, klasa RoutedEventArgs dziedziczy po EventArgs – czyli wszystko jest jak być powinno. Powyższą klasę należy wypełnić kodem, który zostanie wywołany przy zajściu zdarzenia – kliknięcia na przycisk o nazwie button1.
Aby nasza funkcja obsłużyła dane zdarzenie należałoby dokonać subskrypcji poprzez dopisanie delegaty do listy delegat, czyli zdarzenia. W przykładzie powyżej nie musieliśmy tego robić? Nie prawda, też musieliśmy, ale zrobiła to za nas platforma. W pliku MojaKlasa.g.cs (przy nowym projekcie MainWindow.g.cs), który jest generowany na podstawie naszego pliku .cs oraz .xaml czytamy:

 
#line 6 "..\..\..\MainWindow.xaml"
this.button1.Click += new System.Windows.RoutedEventHandler(this.button1_Click);