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

 49
Author: g t, 2010-04-07

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:

  1. ponieważ ozdoby znajdują się na oddzielnej warstwie, wizualizacja może wykraczać poza zdobiony element, nawet jeśli zdobiony element jest przycięty.
  2. ponieważ ozdoby znajdują się na oddzielnej warstwie, na ogół nie są zasłonięte przez ozdobny pojemnik lub przez kontrolki rodzeństwa.
  3. 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.
  4. 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.
  5. 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:

  1. musisz napisać kod, aby wywołać .GetAdornerLayer() i .Add() oraz zarządzać żywotnością Adornera
  2. 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
  3. zazwyczaj wykonujesz własne obliczenia w kodzie (chyba że używasz ControlTemplate w swoim adornerze)
  4. musisz przesłać RoutedEvents do AdornedElement, jeśli chcesz, aby były obsługiwane przez kontrolę celu
  5. musisz dodać DataContext="{Binding AdornedElement.DataContext}", Jeśli chcesz przenieść DataContext przez
  6. 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.)
  7. 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.

 81
Author: Ray Burns,
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