Styling Listbox – WPF
Posted by: Murugan on: February 11, 2009
- In: Styles
- 2 Comments
By default Listbox will list the data in Vertical style. WPF gives us easy option to change Listbox Orientation and content in desired way.
Styling of Listbox mainly depends on three templates. ControlTemplate, ItemTemplate, ItemPanelTemplate
ControlTempalte : This used to change Appearance for Listbox. Default Listbox Control Template will have MainContainer(Grid,Border) ,Scrollviewer and ItemPresenter.
Main container : To Set Background, Border etc…
ScrollViewer :Container to Scrollbar to Listbox.
ItemPresenter : This is the main Control for Listbox. We should have ItemPresenter to display the Content in Listbox.
<controltemplate TargetType="{x:Type ListBox}">
<border x:Name="Bd" SnapsToDevicePixels="true" Background="Gray"
BorderBrush="Darkgray" BorderThickness="1">
<scrollviewer Padding="{TemplateBinding Padding}" Focusable="false">
<itemspresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</scrollviewer>
</border>
</controltemplate><controltemplate .Triggers>
<trigger Property="IsEnabled" Value="false">
<setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
</trigger>
<trigger Property="IsGrouping" Value="true">
<setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</trigger>
</controltemplate>
ItemTemplate : Item template can have any control to bind with data eg:
<datatemplate x:Key="ItemTemplate">
<grid>
<image x:Name="img" Source="{Binding XPath=Thumbnail}" Width="125" Stretch="Uniform" RenderTransformOrigin="0,0">
</image>
<border Background="#66000000" Height="20" Opacity="0" VerticalAlignment="Bottom" x:Name="txtBorder" BorderBrush="#FF1c1c1c" BorderThickness="0,2,0,0">
<textblock Margin="5,0,0,0" VerticalAlignment="Center" FontWeight="Bold" Text="{Binding XPath=Description}" Foreground="#FFffffff"/>
</border>
</grid>
</datatemplate>
ItemPanelTemplate : Container present inside the this Template will decide the apperance of Listboxitems. By default ItempanelTemplate will have VirtualizingStackPanel with orientation vertical. We can change the orientation horizontal, and we can use any container instead of VirtualizingStackPanel.
Code to Apply Style to our Lsitbox
<listbox Template="{DynamicResource ListBoxStyle}"
ItemTemplate="{DynamicResource ItemTemplate}"
IsSynchronizedWithCurrentItem="True" ItemsPanel="{DynamicResource ItemsPanelTemplate1}"
/>

October 12, 2009 at 2:44 am
Great example. Would love to see the code as a download though.