以编程方式更改ListBox中单个项的样式

时间:2014-07-31 13:07:31

标签: c# wpf silverlight listbox

我看到了一些用于更改ListBox中所选项目的颜色和画笔的示例

我想知道是否有办法根据代码中的事件更改列表框中项目的视觉属性

<ListBox.ItemTemplate>
   <DataTemplate>
      <StackPanel Name="spSceneThumb" Width="110">
          <Border BorderThickness="1" Background="#FFfcfcfc" BorderBrush="#aaaaff" >
               <StackPanel></StackPanel>
          </Border>
      </StackPanel>
  </DataTemplate>
</ListBox.ItemTemplate>

假设我想根据某些事件更改第5项的边框颜色

我尝试过IValueConverter但是对属性的更改不会影响边框颜色

1 个答案:

答案 0 :(得分:1)

您可以使用RoutedEvent声明可以收听的自定义EventTrigger。您可以在MSDN上的How to: Create a Custom Routed Event页面中找到如何声明自定义RoutedEvent的方法。创建后,您可以使用事件名称前面的类名引用自定义事件,而不要忘记为声明它的命名空间定义的XAML命名空间前缀。像这样:

RoutedEvent="YourNamespacePrefix:YourClassName.YourEventName"

但是,使用Brush更改EventTrigger等离散值并非如此简单。您必须使用Storyboard DiscreteObjectKeyFrame元素。你可以尝试这样的事情:

<DataTemplate x:Key="Something">
    <StackPanel Name="spSceneThumb" Width="110">
        <Border Name="Border" BorderThickness="1" Background="#FFFCFCFC">
            <StackPanel>
                ...
            </StackPanel>
            <Border.Resources>
                <SolidColorBrush x:Key="EventBrush" Color="Red" />
            </Border.Resources>
            <Border.Style>
                <Style TargetType="{x:Type Border}">
                    <Setter Property="BorderBrush" Value="#FFAAAAFF" />
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Prefix:YourClassName.YourEventName">
                            <EventTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames 
                                            Storyboard.TargetName="Border" 
                                            Storyboard.TargetProperty="BorderBrush">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0" 
                                                Value="{StaticResource EventBrush}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </BeginStoryboard>
                            </EventTrigger.EnterActions>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Border.Style>
        </Border>
    </StackPanel>
</DataTemplate>