如何更改动态数据模板中的WP7 List SelectedItem背景?

时间:2012-02-14 09:45:21

标签: windows-phone-7

我的应用程序中有一个列表,它使用app.xaml中定义的动态项模板,并在C#代码的运行时附加到它。

我想改变所选项目的背景,但我的page.xaml中没有可用的模板来编辑所选状态的项目模板的副本。

是否有办法从C#更改所选项目背景。或者甚至在app.xaml中定义一个状态以将其提供给列表?

1 个答案:

答案 0 :(得分:0)

有。如果您可以访问Expression Blend,则可以修改默认XAML以更改VisualStateManager中所选状态的处理方式。也可以找到使用的默认XAML并覆盖App.Xaml中的XAML。

基本上,您需要为ListBoxItem定义新的样式资源,并将其应用于列表框。例如......

<ListBox Margin="0" Name="MyListBox" ItemContainerStyle="{StaticResource ListBoxItemStyle1}" />


<Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
  <Setter Property="Background" Value="Transparent"/>
  <Setter Property="BorderThickness" Value="0"/>
  <Setter Property="BorderBrush" Value="Transparent"/>
  <Setter Property="Padding" Value="0"/>
  <Setter Property="HorizontalContentAlignment" Value="Left"/>
  <Setter Property="VerticalContentAlignment" Value="Top"/>
  <Setter Property="Template">
  <Setter.Value>
    <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"/>
            <VisualState x:Name="Disabled">
              <Storyboard>
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="LayoutRoot">
                  <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource TransparentBrush}"/>
                </ObjectAnimationUsingKeyFrames>
                <DoubleAnimation Duration="0" To=".5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ContentContainer"/>
              </Storyboard>
            </VisualState>
          </VisualStateGroup>
          <VisualStateGroup x:Name="SelectionStates">
            <VisualState x:Name="Unselected"/>
<!-- This is the bit you are specifically interested in -->
              <VisualState x:Name="Selected">
                <Storyboard>
                   <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentContainer">
                     <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneAccentBrush"/>
                   </ObjectAnimationUsingKeyFrames>
                </Storyboard>
              </VisualState>
<!-- This is the end of the bit you are specifically interested in -->
            </VisualStateGroup>
          </VisualStateManager.VisualStateGroups>
          <ContentControl x:Name="ContentContainer" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"/>
        </Border>
      </ControlTemplate>
    </Setter.Value>
    </Setter>
  </Style>