3 typy routed events:
- Direct Events - zdarzenia, które są najbliższe tym znanym z WindowsForms. Zdarzenie to jest wywoływane i obsługiwane tylko u źródła, przykład: MouseLeave'
- Bubbling events - wywołane najpierw u źródła, a następnie przechodzi w dół drzewa wizualnego. Przykładem może być okno w którym na panelu leży label. Zdarzenie MouseDown wywołane na labelu, przejdzie na panel a następnie na okno. Na każdym z tych poziomów możemy je obsłużyć.
- Tuneling Events - jest to zdarzenie działające odwrotnie do Bubbling event, swoją drogę rozpoczyna w najstarszym przodku, aż do kontrolki która faktycznie je wywołała
Zdatzenie typu Tunelling są zawsze wykonywane przed zdarzeniami typu Bubbling.
Routet events args
Klasa ta zawiera bogate informacje o zdarzeniu oraz jego źródła. Właściwości które można w niej znaleźć:
- Handled - determinuje czy zdarzenie zostało obsłużone. Można dzięki temu zatrzymać dalszy postęp bubblingu lub tunelingu
- OriginalSource - zwraca informację o źródle skąd pochodzi zdarzenie. Przeważnie zwraca to samo co właściwość Source, dla kontrolek typu composite może być to jednak inna wartość
- RoutedEvent - w przypadku łapania więcej niż jednego zdarzenia za pomocą tego samego uchwytu, można dzięki tej właściwości zidentyfikować zdarzenie
- Source - zwraca obiekt który wywołał zdarzenie
Dodawanie uchwytu
Uchwyt do zdarzenia najlepiej dodać w XAML-u:
Code:
Istnieje możliwość przypięcia zdarzenia do kontrolki, która w normalnych warunkach go nie rzuca. Są to tzw. Attached Events. Dla przykładu można przypiąć zdarzenie kliknięcia Gridowi, który posiada button:
Code:
EventManager
Jest to klasa, która zajmuje się rejestracją wszystkich zdarzeń w aplikacji WPF. Właściwości:
- GetRoutedEvents - zwraca tablicę wszystkich zaarejestrowanych Routed Events
- GetRoutedEventsForOwner - zwraca tablicę wszystkich zarejestrowanych zdarzeń dla podanego obiektu
- RegisterClassHandler - rejestruje uchwyt na poziomie klasy
- RegisterRoutedEvent - rejestruje uchwyt na poziomie instancji klasy
Tworzenie nowego Routed Event
1. Tworzymy publiczne, tylko do odczytu zdarzenie:
Code:
2. Tworzymy wrapper dla Routed Event:
Code:
3. Używając EventManager rejestrujemy zdarzenie w konstruktorze klasy, która będzie go używać:
Code:
Podajemy kolejno: nazwę zdarzenia, rodzaj, typ delegaty, klasę która jest jego właścicielem.
Wywoływanie zdarzenia w kodzie polega na stworzeniu obiektu klasy RoutedEventArgs, a następnie wywołanie zdarzenia za pomocą metody RaiseEvent:
Code:
Tworzenie uchwytu na poziomie klasy
Uchwyt taki wywoływany jest dla każdej klasy żądanego typu i jest wywoływany przed uchwytem na poziomie instancji klasy. Tworzenie takiego uchwytu:
1. Tworzymy statyczną metodę o takiej samej sygnaturze jak zdarzenie:
Code:
2. W statycznym konstruktorze, który będzie korzystał z tego zdarzenia tworzymy delegate do metody:
Code:
3. Także w statycznym konstruktorze rejestrujemy uchwyt:
Code:
Zdarzenia na poziomie aplikacji
Klasa Application zawiera standardowe zdarzenia, które mogą zajść podczas korzystania z aplikacji. Wybrane z nich:
- Activated - wywoływane podczas pierwszego uruchomienia aplikacji jak i przy przejściu z innej do naszej
- Deactivated - wywołuje się w momencie przejścia do innej aplikacji
- DispatcherUnhandledException - Wywoływany w momencie gdy wyjątek nie zostanie nigdzie obsłużony
- Exit - wywołuje się niezależnie od powodu zamknięcia aplikacji
- SessionEnding - wywoływany w momencie gdy użytkownik wylogowuje się lub zamyka komputer
- Startup - wywoływany w momencie uruchamiania aplikacji
1. W pliku App.xaml dodajmy zdarzenie:
Code:
2. W kodzie C# obsługujemy je:
Code:
Brak komentarzy:
Prześlij komentarz