ItemsControl隔行变色

原创
2019/03/13 23:04
阅读数 36

一个newbee的第一步。。。

今晚自学WPF,使用了C#高级编程中的一个例子,显示系统中所有字体。

运行之后想要做一个隔行变色的功能,一开始是这样尝试的:到网上搜索到需要使用ItemsControl.AlternationIndexProperty,参考msdn上的说明如下:

ItemsControl.AlternationIndex Attached Property

ItemsControl.AlternationIndex Attached Property

定义

命名空间:

System.Windows.Controls

Assembly:

PresentationFramework.dll

Gets the assigned value of the item container when alternating item containers are used.

... ...

The AlternationCount and ItemsControl.AlternationIndex properties enable you to specify the appearance for two or more alternating item containers. For example, you can specify alternating background colors for every third item in an ItemsControl. The ItemsControl.AlternationIndex is assigned to each item container in the ItemsControlItemsControl.AlternationIndex begins at 0, increments until it is AlternationCount minus 1, and then restarts at 0. For example, if AlternationCount is 3 and there are seven items in the ItemsControl, the following table lists the ItemsControl.AlternationIndex for each item.

Position of Item in the ItemsControl ItemsControl.AlternationIndex
1 0
2 1
3 2
4 0
5 1
6 2
7 0

一开始没太明白,经试验,当指定隔单行变色反复时,对于继承自ItemsControl的控件,需要指定AlternationCount属性为2,表示每2行重复。如果设定为3,则是可以设置三种不同颜色,每3行重复颜色设置。对Items Control的元素类型设置Style,即可实现隔行变色功能:

<Window.Resources>
  <!---->
  <Style x:Key="alternatingWithTriggers" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Background" Value="Blue"/>
    <Setter Property="Foreground" Value="White"/>
    <Style.Triggers>
      <Trigger Property="ItemsControl.AlternationIndex" Value="1">
        <Setter Property="Background" Value="CornflowerBlue"/>
        <Setter Property="Foreground" Value="Black"/>
      </Trigger>
      <Trigger Property="ItemsControl.AlternationIndex" Value="0">
        <Setter Property="Background" Value="LightBlue"/>
        <Setter Property="Foreground" Value="Navy"/>
      </Trigger>
    </Style.Triggers>
  </Style>
</Window.Resources>
<Grid>
  <ListBox x:Name="FontList" AlternationCount="2" ItemsSource="{Binding}" ItemContainerStyle="{StaticResource alternatingWithTriggers}">
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel Orientation="Horizontal" x:Name="backPanel" Background="Transparent">
          <TextBlock Margin="3, 0, 3, 0" FontFamily="{Binding Path=Source}" FontSize="18" Text="{Binding Path=Source}"/>
          <TextBlock Margin="3, 0, 3, 0" FontFamily="{Binding Path=Source}" FontSize="18" Text="cn|elements" />
          <TextBlock Margin="3, 0, 3, 0" FontFamily="{Binding Path=Source}" FontSize="18" FontStyle="Italic" Text="Italic"/>
          <TextBlock Margin="3, 0, 3, 0" FontFamily="{Binding Path=Source}" FontSize="18" FontWeight="UltraBold" Text="UltraBold"/>
          <TextBlock Margin="3, 0, 3, 0" FontFamily="{Binding Path=Source}" FontSize="18" FontWeight="UltraLight" Text="UltraLight"/>
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>
  </ListBox>
</Grid>

需要注意的是,如果在Itemplate中设置的的DataTemplate下的Triggers中触发更改背景色是达不到预期效果的,这种情况下只有AlternationIndex=0时的触发器能够动作,因此无法实现隔行变色功能,只能设置单一颜色。由于没有深入研究,虽有猜测但是不能作为依据。

展开阅读全文
WPF
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部