poniedziałek, 28 listopada 2011

WPF: Tworzenie własnych kontrolek

Tworzenie własnych kontrolek w WPF jest z pozoru łatwym zadaniem, klikamy Add-> new UserControl-> i wrzucamy do Contentu nowo powstałej kontrolki co nam się tylko podoba :) kontrolka działa, jest piękna i wszystko jest git. Nie jest to jednak najlepsze rozwiązanie.

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

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Online Project management