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>1</ListBoxItem>
<ListBoxItem>2</ListBoxItem>
<ListBoxItem>3</ListBoxItem>
<ListBoxItem>4</ListBoxItem>
</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)