Kolejna “nowość” (dla mnie) w WPF. Wiadomo, że możemy tworzyć style dla wszystkich elementów naszego UI. Jednak WPF daje nam jeszcze większą możliwość dostosowania wyglądu – w tym przypadku tylko kontrolek, które są kontenerami dla innych. Jak to uzyskać? Wystarczy skorzystać z klasy StyleSelector.
Zacznijmy od stworzenia naszego Selectora.
public class MyStyleSelector : StyleSelector
{
public override Style SelectStyle(object item, DependencyObject container)
{
var style = new Style(typeof (ListBoxItem));
var setter = new Setter {Property = Control.BackgroundProperty};
var listBox = ItemsControl.ItemsControlFromItemContainer(container);
var index = listBox.ItemContainerGenerator.IndexFromContainer(container);
setter.Value = index%2 == 0 ? Brushes.LightBlue : Brushes.Beige;
style.Setters.Add(setter);
return style;
}
}
Co się dzieje w naszej metodzie? Tworzymy obiekt Style i ustawiamy typ, którego będzie dotyczył (w naszym przypadku ListBoxItem). Następnie tworzymy Setter definiując jaka właściwość nas interesuje (Background). Następnie za pomocą helpera (ItemsControl) pobieramy kontener i badamy jego indeks. W zależności od jego pozycji ustawiamy tło.
Co nam pozostaje to użycie naszego Selectora w XAML’u.
Dodajemy namespace do naszej klasy:
<Window x:Class=”StyleSelectorDemo.Window1″
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:StyleSelectorDemo=”clr-namespace:StyleSelectorDemo”
Title=”Window1″ Height=”300″ Width=”300″>
Dodajemy element do słownika zasobów:
<Window.Resources>
<StyleSelectorDemo:MyStyleSelector x:Key=”myStyleSelector” />
Window.Resources>
No i samo użycie:
<ListBox ItemContainerStyleSelector=”{DynamicResource myStyleSelector}”>
<ListBoxItem>1ListBoxItem>
<ListBoxItem>2ListBoxItem>
<ListBoxItem>3ListBoxItem>
<ListBoxItem>4ListBoxItem>
ListBox>
Możemy użyć także StaticResource – zależy od tego czy nasz styl może się zmieniać dynamicznie i czy chcemy aby te zmiany były odwzorowane.
Efekt końcowy….(działający także w trybie Design)
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl