以编程方式更改列表框中单个项目的样式

本文关键字:单个 项目 样式 编程 方式更 列表 | 更新日期: 2023-09-27 18:15:53

我看到了一些在列表框中更改选定项目的颜色和笔刷的例子

我想知道是否有一种方法可以根据我们代码中的事件改变列表框中项目的视觉属性

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

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

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

以编程方式更改列表框中单个项目的样式

您可以声明一个自定义的RoutedEvent,您可以与EventTrigger一起收听。您可以在如何:在MSDN上创建自定义路由事件页面中找到如何声明自定义RoutedEvent。创建之后,您可以在事件名称之前使用类名引用自定义事件,并且不会忘记为声明该事件的名称空间定义的XAML Namespace Prefix。像这样:

RoutedEvent="YourNamespacePrefix:YourClassName.YourEventName"

但是,使用EventTrigger更改离散值(如Brush es)并不是那么简单。您必须使用StoryboardDiscreteObjectKeyFrame元素。您可以尝试这样做:

<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>