Wady:
- w 99% przypadków stworzymy "ciężki" obiekt, który ma masę funkcjonalności do niczego nie potrzebnych.
- zaszywamy całą logikę w code-behind (odwołania przez Name do elementów w xaml'u). Co się stanie gdy musimy zmienić coś w xamlu, np podmienić ListBox'a na Grida. Nagle połowa naszych metod, które odwoływały się do tego ListBoxa musi zostać usunięta i napisana od nowa (trudniej skalowalny komponent).
Zalety:
- Często szybsza implementacja.
Na szczęście Microsoft zaopatrzył nas w całą gamę klas, które mogą nam posłużyć za bazę naszego komponentu (FrameworkElement, Shape, Control, ContentControl itd...). Po pierwsze trzeba wyizolować podstawową funkcjonalność tworzonego komponentu i wybrać odpowiednią klasę, która posłuży nam za bazę. Po drugie tworzymy zwykłą klasę nie "xamlową", która dodaje nasze niestandardowe funkcje do klasy bazowej. Na samym końcu na podstawie naszej nowej klasy możemy stworzyć xamla, któremu definiujemy Templata.
Przykład
public class Stupid : Control
{
public static readonly DependencyProperty StupidTextProperty =
DependencyProperty.Register("StupidText", typeof(string), typeof(Stupid));
public string StupidText
{
get { return (string)GetValue(StupidTextProperty); }
set { SetValue(StupidTextProperty, value); }
}
}
<WpfApplication2:Stupid x:Class="WpfApplication2.ConcreteStupid"
...>
<WpfApplication2:Stupid.Template>
<ControlTemplate TargetType="WpfApplication2:Stupid">
<TextBlock Text="{Binding StupidText, RelativeSource={RelativeSource
Mode=TemplatedParent}}"/>
</ControlTemplate>
</WpfApplication2:Stupid.Template>
</WpfApplication2:Stupid>
Ten przykład jest ekstremalnie prosty i ma za zadanie jedynie przedstawić szkic rozwiązania.
W przypadku, gdy zależy nam na stworzeniu bardzo lekkiego obiektu, chcemy mieć wpływ na to jak jest renderowany i chcemy stworzyć coś od zupełnych podstaw, warto się zastanowić nad klasą FrameworkElement jako bazą naszej kontrolki.
Proces tworzenia kontrolek jest świetnie opisany w książce "WPF Control Development Unleashed".
0 komentarze:
Prześlij komentarz