更改列表框中selecteditem的样式

时间:2012-03-19 12:41:24

标签: silverlight listbox visualstatemanager selecteditemtemplate

我有一个ScrollViewer:

<ScrollViewer Width="160" 
              VerticalScrollBarVisibility="Auto" 
              HorizontalScrollBarVisibility="Hidden" 
              Height="324" Canvas.Top="0" 
              BorderThickness="0" Padding="0">
   <ListBox x:Name="Snapshots" SelectionChanged="Snapshots_SelectionChanged" 
            Padding="0" Background="#FFF0F0F0" 
            BorderBrush="{x:Null}" VerticalAlignment="Top" 
            SelectionMode="Single">
      <ItemsControl.ItemTemplate>
         <DataTemplate>
            <Image Source="{Binding imageSource}" 
                   Margin="5" Stretch="UniformToFill" 
                   Width="120" Opacity="0.2"/>
         </DataTemplate>
      </ItemsControl.ItemTemplate>
      <ItemsControl.ItemsPanel>
         <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical"  
                        VerticalAlignment="Top"  HorizontalAlignment="Center"/>
         </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
   </ListBox>
</ScrollViewer>

如何实现这些功能:

  1. 更改所选项目的不透明度(图像)。
  2. 更改所选项目的默认边框样式(图像)。

2 个答案:

答案 0 :(得分:5)

更改ItemContainerStyle中的ListBox。来自MSDN的小样本:

<Style x:Key="ItemContainerStyle" TargetType="ListBoxItem">
    ...
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="ListBoxItem">
            <Grid Background="{TemplateBinding Background}">
               <vsm:VisualStateManager.VisualStateGroups>
                  ...
                  <vsm:VisualStateGroup x:Name="SelectionStates">
                     <vsm:VisualState x:Name="Unselected" />
                     <vsm:VisualState x:Name="Selected">
                        <Storyboard>
                           <DoubleAnimation 
                                     Storyboard.TargetName="contentPresenter" 
                                     Storyboard.TargetProperty="Opacity" 
                                     Duration="0" To=".75"/>
                        </Storyboard>
                     </vsm:VisualState>
                  </vsm:VisualStateGroup>
                     ...
               </vsm:VisualStateManager.VisualStateGroups>
               <ContentPresenter
                       x:Name="contentPresenter"
                       Content="{TemplateBinding Content}"
                       ContentTemplate="{TemplateBinding ContentTemplate}"
                       HorizontalAlignment="{TemplateBinding
                                                  HorizontalContentAlignment}"
                       Margin="{TemplateBinding Padding}"/>
             </Grid>
          </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


<ListBox ItemContainerStyle="{StaticResource ItemContainerStyle}" 
         x:Name="Snapshots" 
         SelectionChanged="Snapshots_SelectionChanged" Padding="0"
         Background="#FFF0F0F0" 
         BorderBrush="{x:Null}" 
         VerticalAlignment="Top" SelectionMode="Single">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Image Source="{Binding imageSource}" Margin="5" 
                   Stretch="UniformToFill" Width="120" Opacity="0.2"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Vertical"  
                        VerticalAlignment="Top"  
                        HorizontalAlignment="Center"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ListBox>

此外,您可以使用Selected VisualState中的边框进行动画制作。

答案 1 :(得分:1)

谢谢你, 它现在正在运作。 这是我更新后的风格:

<Style x:Key="ItemContainerStyle" TargetType="ListBoxItem">
        <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="ListBoxItem">
                    <Grid Background="{TemplateBinding Background}">

                        <vsm:VisualStateManager.VisualStateGroups>
                            <vsm:VisualStateGroup x:Name="SelectionStates">
                                <vsm:VisualState x:Name="Unselected" />

                                <vsm:VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ImageBorder" Storyboard.TargetProperty="Visibility" Duration="0">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                        <DoubleAnimation Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="Opacity" Duration="0" To="1"/>
                                    </Storyboard>

                                </vsm:VisualState>
                            </vsm:VisualStateGroup>
                        </vsm:VisualStateManager.VisualStateGroups>
                        <ContentPresenter
                              x:Name="contentPresenter"
                              Content="{TemplateBinding Content}"
                              ContentTemplate="{TemplateBinding ContentTemplate}"
                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                              Opacity="0.2"
                              Margin="{TemplateBinding Padding}" />
                        <Border BorderBrush="Black" BorderThickness="5" x:Name="ImageBorder" Visibility="Collapsed"/>
                    </Grid>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

这是列表框:

 <ScrollViewer Width="160" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Hidden" Height="324" Canvas.Top="0" BorderThickness="0" Padding="0">
                            <ListBox ItemContainerStyle="{StaticResource ItemContainerStyle}" x:Name="ListBox_AcceptedPhotos" SelectionChanged="Snapshots_SelectionChanged" Padding="0" Background="#FFF0F0F0" BorderBrush="{x:Null}" VerticalAlignment="Top" SelectionMode="Single">
                                <ItemsControl.ItemTemplate>
                                    <DataTemplate>
                                            <Image Source="{Binding imageSource}" Margin="5" Stretch="UniformToFill" Width="120" MouseLeftButtonUp="Image_MouseLeftButtonUp" />
                                    </DataTemplate>
                                </ItemsControl.ItemTemplate>
                                <ItemsControl.ItemsPanel>
                                    <ItemsPanelTemplate>
                                        <StackPanel Orientation="Vertical"  VerticalAlignment="Top"  HorizontalAlignment="Center"/>
                                    </ItemsPanelTemplate>
                                </ItemsControl.ItemsPanel>
                            </ListBox>
                        </ScrollViewer>