WPF ControlTemplate vs UserControl

Ostatnio zrobiłem UserControl , co zajęło mi dość dużo czasu, ponieważ musiałem pracować z niestandardowymi właściwościami zależności i tak dalej...

W każdym razie, to było tylko kilka kontrolek 3: TextBox, Popup z hierarchicznym drzewem.

Teraz zdałem sobie sprawę, że prawdopodobnie mógłbym napisać ControlTemplate tylko. Jakie są zatem Korzyści z używania UserControl?

Author: Kenan E. K., 2009-07-15

2 answers

Są trzy przypadki do rozważenia: UserControl, ControlTemplate i custom Control. (Domyślam się, że Datatematplate nie wymaga wyjaśnienia)

A niestandardowa Kontrola jest czymś, co zapewniasz, gdy tworzysz podstawową funkcjonalność nowego komponentu interfejsu użytkownika. Istnieją różne plusy i minusy tego, ale na przykład, jeśli chcesz niestandardowego zachowania wyboru ItemsControl, najlepiej możesz to zrobić poprzez podklasowanie selektora lub Multiselektora(robi to DataGrid Wpftoolkit). Ponadto, jeśli chcesz obiekt, który będzie zawierał nową DependencyProperty, będziesz w większości przypadków czerpać z kontroli.

Zasada wpf zawarta tutaj jest paradygmatem sterowania "bez widoczności" lub "pamiętaj, aby oczekiwać, że ktoś zastosuje szablon twojej kontroli, lub przynajmniej spraw, aby zachowywała się ładnie w twoim własnym scenariuszu szablonu". Niestandardowe kontrolki są zwykle tworzone z myślą o wielokrotnym użyciu, często jako część bibliotek DLL framework.

A ControlTemplate jest zasadniczo opisem zastępcze drzewo wizualne i może być ustawione albo jawnie na frameworkach, albo jako część stylu. Jest to opcja, do której powinieneś dążyć, gdy twoim celem jest przede wszystkim złożenie wniosku i wykonanie go. Możesz zrobić prawie wszystko z ControlTemplate wizualnie, jeśli jesteś w stanie uzyskać powiązania i wyzwalacze (i możliwy zawierający sam styl). Wszystko to Można zadeklarować jako zasób ponownie użyty, aby nadać aplikacji wspólny "motyw".

A UserControl jest samodzielną kontrolą złożoną, z częściami edytowalnymi indywidualnie w Projektancie i jest najlepiej używany, jeśli chcesz zobaczyć swoje komponenty i zarządzać nimi w Projektancie. Z drugiej strony ControlTemplate nie będzie wystawiał swoich komponentów do manipulacji w Projektancie (chociaż będzie widoczny). Zazwyczaj tworzysz UserControl dla strony szczegółów Klienta lub przeglądarki wyświetlania produktu, lub w dowolnym przypadku, w którym nie chcesz tworzyć pełnej kontroli, ale chcesz szczegółowy widok z pełną obsługą projektanta.

Szczególnym przypadkiem jest użycie wzorca MVVM . Wiele wspaniałych implementacji MVVM używa UserControls jako widoków, a ControlTemplates i Styles jako zasobów używanych przez te widoki. Praktyka MVVM minimalizuje również potrzebę niestandardowej kontroli i ma wiele innych korzyści.

(Aby uzyskać więcej informacji na temat MVVM, między innymi, Google dla fantastycznych artykułów Josha Smitha, Sacha Barbera i Karla Shiffletta)

 54
Author: Kenan E. K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-18 11:03:04

Jeśli dodajesz własne właściwości zależności, wtedy będziesz potrzebował własnej klasy, na podstawie której je zdefiniujesz.

Ponieważ chcesz zastosować szablon do klasy, ta niestandardowa klasa będzie musiała pochodzić z Control (tak jak robi to UserControl).

Główną zaletą pisania własnej klasy pochodnej Control jest to, że może ona mieć swój szablon przedefiniowany dla innych scenariuszy użycia, przez Ciebie w aplikacji lub przez innych użytkowników tego typu.

Jest bardzo mało narzutu w korzystaniu z Klasa. W rzeczywistości, jeśli spojrzeć na to w Reflector.NET, zobaczysz, że prawie nie ma żadnego kodu. Przede wszystkim UserControl po prostu redefiniuje metadane niektórych istniejących właściwości zależności (takich jak tworzenie domyślnej wartości FocusableProperty false.)

O ile nie musisz od razu redefiniować szablonu kontrolki, możesz na razie zostawić go jako UserControl, a w razie potrzeby zmienić go później.

 3
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-15 12:36:36