2016-11-13 51 views
5

Używam klasy wywodzącej się z klasy UIElement podczas pisania programu UWP za pomocą C#, gdzie chcę dołączyć obsługę kontrolek wejściowych, takich jak działania myszy i klawiatury. Teraz widzę, że istnieją już wirtualne metody, które mówią: OnSomeEvent() i wyraźnie mogę zastąpić te metody, aby dopasować się do mojego procesu obsługi, lub mogę utworzyć nową metodę zdefiniowaną w klasie bazowej i zasubskrybować je do tych danych wejściowych zdarzenia w konstruktorze. Zakładam, że obie te metody działają, ale mam nadzieję, że wiem, który z nich jest bardziej profesjonalny lub bardziej celowy, i dlaczego. Pomoże to również wyjaśnić, dlaczego MS oferuje te dwa sposoby w tym samym czasie.Czy powinienem utworzyć nową metodę obsługi zdarzenia lub przesłonić metodę bazową?

Oto wydarzenia i metod UIElement klasy https://msdn.microsoft.com/en-us/library/system.windows.uielement(v=vs.110).aspx#Examples

i paragraf cytuje

UIElement stanowi punkt wyjścia dla układu elementem cech, a także naraża metod wirtualnych, które dotyczą zajęcia może przesłonić, co może wpływać na zachowanie renderowania układu elementu i jego elementów podrzędnych. Znaczna część zachowania wejścia i skupienia dla elementów w ogóle jest również zdefiniowana w klasie UIElement . Dotyczy to zdarzeń związanych z wprowadzaniem klawiatury, myszy i pisaka, i pokrewnymi właściwościami statusu. Wiele z tych zdarzeń to zdarzenia routowane, a wiele zdarzeń związanych z wejściami ma zarówno wersję z propagacją rutowania, jak i tunelującą wersję zdarzenia. Te sparowane zdarzenia są zwykle zdarzeniami o największym znaczeniu dla kontroli autorów .

Odpowiedz

1

W klasie pochodnej zwykle zastępuję istniejącą metodę.

Dlaczego? Obsługa zdarzeń jest mniej niezawodna niż metoda przesłaniania. Na przykład klasy zewnętrzne mogą usuwać procedury obsługi zdarzeń, ale nie mogą zmienić kodu w trybie zastępowania. Musisz jednak zapieczętować własną klasę lub Twoja metoda może zostać zmieniona.

Inną kwestią do rozważenia jest: czy chcę zmienić sposób działania sterowania? Czy muszę mieć kontrolę nad dokładnym momentem wykonania kodu (powiedzmy przed kodem klasy bazowej, po lub zamiast)? Jeśli tak, musisz użyć przesłonięcia.

+0

Dlaczego nadpisywanie oferuje kontrolę nad momentem wykonania, podczas gdy zdarzenia, jak możesz sugerować, nie są? –

+1

Ponieważ zdarzenia są obsługiwane, niezależnie od tego, kto zasubskrybuje pierwszy, a także nie można obsłużyć niczego, zanim program obsługi zdarzeń go wyrzuci. Może "UIElement" już uruchomił jakiś kod, którego nie chcesz. Możesz temu zapobiec, gdy zastąpisz metodę. –