Kiedy należy używać ozdób?
WPF jest wielki, ponieważ istnieje wiele sposobów, aby osiągnąć swoje cele. Na przykład z tego, co rozumiem, adorners może dodać pewne kontrolki do elementu interfejsu użytkownika, ale myślę, że to samo zachowanie można osiągnąć poprzez niestandardową kontrolę, która zawiera dodatkowy element.
Więc moje pytanie brzmi: Kiedy powinienem preferować bardziej złożone (ale myślę, że bardziej elastyczne) sterowanie niestandardowe? Proszę wziąć pod uwagę, że intensywnie używam wzorca MVVM i chciałbym związać polecenia do dodatkowego elementu.
W szczególności projektuję aplikację do projektowania diagramów i chciałbym dodać punkty połączeń do moich kształtów. Innym przykładem, w którym powinienem zdecydować się między niestandardową kontrolką a adornerem, jest linia, która pokazuje Etykietę automatycznie ustawioną, aby "podążać" za linią.
Thank you
1 answers
Ozdoby wymagają nieco więcej pracy niż używanie ControlTemplates do większości celów. Jeśli chcesz mieć dodatkowe funkcje, które zapewniają adorners, użyj ich. W przeciwnym razie użyj ControlTemplates.
Oto główne cechy, które przynoszą Ozdoby do stołu:
- ponieważ ozdoby znajdują się na oddzielnej warstwie, wizualizacja może wykraczać poza zdobiony element, nawet jeśli zdobiony element jest przycięty.
- ponieważ ozdoby znajdują się na oddzielnej warstwie, na ogół nie są zasłonięte przez ozdobny pojemnik lub przez kontrolki rodzeństwa.
- Adornery są automatycznie powiadamiane o wszystkich zmianach rozmiaru i lokalizacji zdobionego elementu, umożliwiając reagowanie na zmiany układu, które nie są tak łatwe do osiągnięcia przy użyciu zwykłych kontrolek.
- Adornery mogą być stosowane do paneli i istniejących kontrolek bez wprowadzania zmian w szablonach lub w inny sposób. To sprawia, że są dobre do zapewnienia uchwytów manipulacji lub wizualnej informacji zwrotnej na dowolny sterowanie.
- w wielu scenariuszach można tworzyć ozdoby tylko dla kilku "aktywnych" elementów z setek lub tysięcy. Implementacja tej samej funkcjonalności za pomocą ControlTemplates może być znacznie mniej wydajna, jeśli trzeba dodać dodatkowy Panel do szablonu: każda pojedyncza instalacja szablonu będzie miała dodatkowy panel, podczas gdy będzie tylko jeden adorner.
Oto niektóre z potencjalnych kosztów związanych z używaniem ozdób w przeciwieństwie do ControlTemplates:
- musisz napisać kod, aby wywołać
.GetAdornerLayer()
i.Add()
oraz zarządzać żywotnością Adornera - musisz napisać kod renderujący dla swojego Adornera lub dodać kod, aby zawierał
Control
jako potomek adornera, aby można było z nim korzystać z ControlTemplate - zazwyczaj wykonujesz własne obliczenia w kodzie (chyba że używasz ControlTemplate w swoim adornerze)
- musisz przesłać
RoutedEvents
do AdornedElement, jeśli chcesz, aby były obsługiwane przez kontrolę celu - musisz dodać
DataContext="{Binding AdornedElement.DataContext}"
, Jeśli chcesz przenieść DataContext przez - wygląda na to, że widoczny Adorner jest skanowany na każdym przejściu układu, więc posiadanie wielu tysięcy adorników na ekranie może spowodować zauważalne spowolnienie. (Zwykłe wizualizacje mają kod miary/aranżacji wywoływany tylko wtedy, gdy zmienia się coś, co bezpośrednio na nie wpływa.)
- posiadanie więcej niż 144 zdobień nie jest obsługiwane , więc kontrola szablony są bardziej odpowiednie, jeśli istnieje ryzyko zbliżenia się do tego limitu.
W twoich konkretnych przykładach nie ma jasnych, właściwych odpowiedzi.
Skłaniałbym się ku użyciu ControlTemplate dla punktów połączeń, ponieważ prawdopodobnie będziesz potrzebował sposobu na określenie lokalizacji punktów połączeń, a ControlTemplate już definiuje układ samego elementu. Z drugiej strony, Jeśli informacje o punkcie połączenia są oparte na danych i pojawiają się tylko na aktywnym sterowaniu (lub sterowaniu przeciąganym) może być lepiej użyć adornerów, aby uzyskać korzyści wydajnościowe i uprościć poszczególne ControlTemplates.
Automatycznie umieszczana etykieta może być dobrym wyborem dla adornera z punktu widzenia miary/aranżacji obliczeń, jeśli linie nie są prostymi liniami prostymi, ale jeśli potencjalnie będziesz miał dziesięć tysięcy tych widocznych na raz, byłbym zaniepokojony wydajność.
Nie wiedząc więcej o aplikacji trudno powiedzieć więcej niż to.
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
2017-05-23 12:32:17