Windows Phone 7: Highlight Selected Listbox item

22,214

Does my answer from this post help?

I think the easiest way would be to go via Expression Blend. Right click on your ListBox (the main control, not its items). Then go to "Edit Additional Templates....(Item Container Style)....Edit Current". Blend will then load a new page for you to modify the styling of the container. In the top left pane (where you can choose project, assets etc...) click on "States". You'll see a list of states. Modify the ones you'd like to change and hopefully that should work

EDIT:

<ControlTemplate TargetType="ListBoxItem">
 <Border x:Name="LayoutRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" HorizontalAlignment="{TemplateBinding HorizontalAlignment}" VerticalAlignment="{TemplateBinding VerticalAlignment}">
  <VisualStateManager.VisualStateGroups>
   <VisualStateGroup x:Name="CommonStates">
    <VisualState x:Name="Normal"/>
    <VisualState x:Name="MouseOver"/>

   </VisualStateGroup>
   <VisualStateGroup x:Name="SelectionStates">
    <VisualState x:Name="Unselected">
     <Storyboard>
      <ColorAnimation Duration="0" To="White" Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" Storyboard.TargetName="ContentContainer" d:IsOptimized="True"/>
      <ColorAnimation Duration="0" To="White" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="ContentContainer" d:IsOptimized="True"/>
     </Storyboard>
    </VisualState>
    <VisualState x:Name="Selected">
     <Storyboard>
      <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="ContentContainer" d:IsOptimized="True"/>
     </Storyboard>
    </VisualState>
    <VisualState x:Name="SelectedUnfocused">
     <Storyboard>
      <ColorAnimation Duration="0" To="Red" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="ContentContainer" d:IsOptimized="True"/>
     </Storyboard>
    </VisualState>
   </VisualStateGroup>
  </VisualStateManager.VisualStateGroups>
  <ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="#FF1BA1E2" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Background="Black" BorderBrush="Black"/>
 </Border>
</ControlTemplate>
Share:
22,214
David Hayes
Author by

David Hayes

Expert .NET developer with broad experience in Java and other languages/platforms

Updated on May 03, 2020

Comments

  • David Hayes
    David Hayes about 4 years

    I have the following XAML (simple list box with custom DataTemplate). I'm trying to figure out how to highlight the selected item (maybe background colour change). I figure I need to do something with Styles in Expression Blend but I'm not quite sure where to start... Edit: After a bit of playing around I now have this (which doesn't seem to do anything)

    <phone:PhoneApplicationPage
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:Custom="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
        x:Class="SqueezeBox.StartPage"
        d:DataContext="{d:DesignData SampleData/MainViewModelSampleData.xaml}"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait"  Orientation="Portrait" 
        mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="696" 
        shell:SystemTray.IsVisible="True">
        <phone:PhoneApplicationPage.Resources>
            <Style x:Key="HighlightItemStyle" TargetType="ListBoxItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <StackPanel x:Name="DataTemplateStackPanel" Orientation="Horizontal">
                                <VisualStateManager.VisualStateGroups>
                                    <VisualStateGroup x:Name="SelectionStates">
                                        <VisualStateGroup.Transitions>
                                            <VisualTransition GeneratedDuration="0" To="Selected">
                                                <Storyboard>
                                                    <ColorAnimation Duration="0" To="#FFFD0D0D" Storyboard.TargetProperty="(TextBlock.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="ItemText" d:IsOptimized="True"/>
                                                </Storyboard>
                                            </VisualTransition>
                                        </VisualStateGroup.Transitions>
                                        <VisualState x:Name="Unselected"/>
                                        <VisualState x:Name="Selected"/>
                                        <VisualState x:Name="SelectedUnfocused"/>
                                    </VisualStateGroup>
                                </VisualStateManager.VisualStateGroups>
                                <Image x:Name="ItemImage" Source="{Binding ThumbnailAlbumArtUri}" Height="62" Width="62" VerticalAlignment="Top" Margin="10,0,20,0"/>
                                <StackPanel x:Name="stackPanel">
                                    <TextBlock x:Name="ItemText" Text="{Binding Name}" Margin="-2,-13,0,0" Style="{StaticResource PhoneTextExtraLargeStyle}" d:IsHidden="True"/>
                                    <TextBlock x:Name="DetailsText" Text="{Binding Artist}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/>
                                </StackPanel>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </phone:PhoneApplicationPage.Resources>
        <!--Data context is set to sample data above and LayoutRoot contains the root grid where all other page content is placed-->
        <Grid x:Name="LayoutRoot" Background="Transparent" d:DataContext="{Binding ServerStatus.Players[0]}" >
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
    
            <!--TitlePanel contains the name of the application and page title-->
            <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12">
                <TextBlock x:Name="ApplicationTitle" Text="Now playing" Style="{StaticResource PhoneTextNormalStyle}"/>
                <TextBlock x:Name="ListTitle" Text="{Binding PlayerName}" Margin="-3,-8,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
                <ProgressBar Visibility="Visible" IsIndeterminate="True" Height="4" HorizontalAlignment="Left" Margin="10,10,0,0" x:Name="progressBar1" VerticalAlignment="Top" Width="460" />
            </StackPanel>
    
            <!--ContentPanel contains ListBox and ListBox ItemTemplate. Place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1">
                <ListBox x:Name="MainListBox" ItemsSource="{Binding Tracks}" ItemContainerStyle="{StaticResource HighlightItemStyle}" />
            </Grid>
        </Grid>
    </phone:PhoneApplicationPage>
    
  • keyboardP
    keyboardP over 13 years
    How are you selecting it? I tried using listbox.SelectedIndex = 0; and it the row became highlighted.
  • David Hayes
    David Hayes over 13 years
    Odd, I'm doing the same thing but I don't see the transition fire. Maybe I have another issue...
  • keyboardP
    keyboardP over 13 years
    I've edited the answer to show the XAML of my test case. Try porting your storyboard (or manually editing) your "Selected" and/or "SelectedUnfocused" VisualStates.
  • David Hayes
    David Hayes over 13 years
    Awesome, that works. How do I incoporate my custom listbox items (image and a couple of text blocks) e.g. <ControlTemplate TargetType="ListBoxItem"> <StackPanel x:Name="DataPanel" Orientation="Horizontal"> <Image x:Name="ItemImage" Source="{Binding ThumbnailAlbumArtUri}" /> <StackPanel x:Name="stackPanel"> <TextBlock x:Name="ItemText" Text="{Binding Name}" Style="{StaticResource PhoneTextExtraLargeStyle}"/> <TextBlock x:Name="DetailsText" Text="{Binding Artist}" Margin="0,-6,0,3" Style="{StaticResource PhoneTextSubtleStyle}"/> </StackPanel> </StackPanel> </ControlTemplate>
  • David Hayes
    David Hayes over 13 years
    Aha, getting there. I hadn't realised that specifying a style Style="{StaticResource PhoneTextExtraLargeStyle}" would override the transition stuff. Blend is finally startting to make some sense to me!
  • Goofy
    Goofy about 10 years
    can you please have a look at here once stackoverflow.com/questions/21746433/…