czwartek, 13 grudnia 2012

70-511 Rozdział 5 - Tworzenie kontrolek w WPF

WPF umożliwia tworzenie dwóch typów kontrolek:
  • User controls - kontrolki zbudowane przez użytkownika, dziedziczą po klasie UserControl. Jest to kontrolka stworzona z kilku innych kontrolek
  • Custom controls - kontrolki stworzone od zera. Dziedziczą po klasie Control lub ContentControl.
Główna różnica pomiędzy tymi kontrolkami od strony deweloperskiej:
  • User controls - tworzymy za pomocą graficznego interfejsu, przeciągając inne kontrolki z zasobnika do okna nowej kontrolki
  • Custom controls - tworzone są od zera w kodzie bez pomocy wizualnego interfejsu
 WPF oferuje więc trzy mechanizmy dostosowywania kontrolek do swoich potrzeb:
  • jeżeli efekt który chcemy uzyskać jest możliwy przy pomocy jednej z istniejących kontrolek, aczkolwiek jej wygląd nam nie odpowiada - stosujemy szablony
  • jeżeli żądany efekt można uzyskać w wyniku połączenia kilku istniejących kontrolek - budujemy user control
  • jeżeli ani wygląd, ani połączenie kilku kontrolek w jedną nie mogą nam pomóc w uzyskaniu pożądanego efektu - tworzymy custom control


Właściwości typu Dependency
Dependency Properties to rodzaj standardowych właściwości dla WPF. Umożliwiają notyfikację zmian, animację, dziedziczenie wartości oraz bindowanie. Właściwości te można tworzyć w klasach które dziedziczą po klasie DependencyObject. Dependency Propeteries to zwykłe właściwości znane z C# wzbogacone o elementy dodane na potrzeby WPF-a.
Przykład implementacji DP:

Code:
        public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register("MyText", typeof (string),
                                                                                               typeof (MyControl),
                                                                                               new PropertyMetadata());

        public string MyText
        {
            get { return (string) GetValue(MyControl.MyTextProperty); }
            set { SetValue(MyControl.MyTextProperty, value); }
        }

Bindowanie do takiej właściwości w XAML:

Code:
<local:MyControl MyText="{Binding Value, Mode=TwoWay}" />



Wygląd na podstawie systemowego schematu kolorów
Począwszy od Windows Visty możliwe jest ustawienie tematu wizualnego. Aplikacje, które integrują się z systemowym tematem, także zmieniają wygląd kontrolek oraz zachowanie.
Aby można było integrować się z systemowym tematem graficznym, należy korzystać z klas z przedrostkiem System np. SystemColors, SystemFonts, SystemParameters.
Klasy te zawierają zdefiniowane kolory, pędzle i ustawienia wykorzystywane w ustawionym temacie systemu operacyjnego. Dodatkowo, gdy użytkownik zmieni temat graficzny, zostaną uaktualnione:

Code:
<TextBlock Background="{DynamicResource {x:Static SystemColors.ControlDarkColor}}"></TextBlock>

Używamy dynamicznych zasobów, gdyż po zmianie tematu przez użytkownika chcemy od razu zobaczyć także zmianę w naszym programie.
Jeżeli mimo wszystko chcemy aby nasze wyglądały indywidualnie niezależnie od zastosowanego tematu graficznego lub też chcemy zmienić wygląd niektórych kontrolek, możemy sami zdefiniować definicje szablonów w zależności od tematu graficznego systemu. Głównym plikiem definiującym wygląd kontrolek jest plik Generic.xaml. Definiuje on wygląd kontrolek w przypadku gdy nie ma zdefiniowanego ich wyglądu dla konkretnego tematu. Pozostałe pliki szablonów definiujemy wg. wzoru:
<ThemeName>.<ThemeColor>
 Wybrane tematy i definicje plików xaml:
Windows Vista - Aero.NormalColor.xaml
Default Windows XP - Luna.NormalColor.xaml
Silver Windows XP - Luna.Metalic.xaml
Windows Classic - Classic.xaml

Niezależnie od tego który temat graficzny zamierzamy zdefiniować musimy i tak stworzyć generyczną wersję (Generic.xaml) na wypadek błędu podczas nakładania stylów zawartych w specyficznym temacie.
Oprócz stworzenia pliku z szablonami kontrolek, należy dodać atrybut ThemeInfo do pliku AssemblyInfo.cs. Atrybut ten przyjmuje dwa atrybuty - pierwszy informuje o miejscu gdzie są przechowywane pliki z szablonami i zasobami dla tematów graficznych, drugi informuje gdzie znajduje się generyczna wersja szablonu.
Możliwe wartości tych parametrów:
  • ResourceDictionaryLocation.None - pliki z specyficznym wyglądem dla tematów nie będą szukane
  • ResourceDictionaryLocation.SourceAssembly: - pliki będą szukane w aktualnym pliku programu
  • ResourceDictionaryLocation.ExternalAssembly - zostaną przeszukane zewnętrzne biblioteki dll. Ich nazwa musi być zgodna ze wzorem: <AssemblyName>.<ThemeName>.dll gdzie <AssemblyName> - nazwa aktualnego pliku dll, <ThemeName> - nazwa tematu graficznego.
 Można także wykorzystać słowniki - Resource dictionary. Należy w tym celu stworzyć folder dla tematów i nie wolno zapomnieć o generycznej wersji.

Brak komentarzy:

Prześlij komentarz