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)