【wpf】ListView 和 ItemsControl 的一点区别

ItemsControl 实现背景间隔效果

<ItemsControl ItemsSource="{StaticResource datas}" AlternationCount="2">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Background="Transparent" Name="root">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Age}" Grid.Column="1"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="Orange" TargetName="root"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ListView实现背景间隔效果

listview无法直接通过DataTemplate.Triggers去设置,只能通过ItemContainerStyle的方式

<ListView ItemsSource="{StaticResource datas}" AlternationCount="2">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Style.Triggers>
                <Trigger Property="ItemsControl.AlternationIndex" Value="1">
                    <Setter Property="Background" Value="Orange"/>
                </Trigger>
                <Trigger Property="IsMouseOver" Value="True">

                </Trigger>
            </Style.Triggers>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid Background="Transparent" Name="root">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Name}"/>
                <TextBlock Text="{Binding Age}" Grid.Column="1"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

通过snoop观察,listview比ItemsControl 多封装了几层:

 由于多了个ListViewItem这一层(所以ListView的数据模板里访问不到ItemsControl中的某些属性),他的下一层才是ItemsControl,所以通过ItemContainerStyle指定了之后ListViewItem才能这么写:ItemsControl.AlternationIndex。

ItemContainerStyle

这个属性在很多列表控件中是用的很频繁的。我在博客【WPF绑定3】 ListView基础绑定和数据模板绑定 也介绍过,可以看看。

StackPanel vs  VirtualizingStackPanel

从上图可以看到,

ItemsControl 使用的是StackPanel    

ListView 使用的是 VirtualizingStackPanel。

VirtualizingStackPanel相较于StackPanel 是做了优化的,VirtualizingStackPanel不会渲染框框之外看不到的子项,也就是当子项较多时,VirtualizingStackPanel将提供更好的性能。

WPF中的ListView控件可以通过设置ItemContainerStyle来自定义行的背景颜色。 首先,我们需要在XAML中定义ListView控件,并将其绑定到数据源。然后,可以使用ListView的ItemContainerStyle属性设置行的样式。 要设置行的背景颜色,可以使用XAML中的触发器(Trigger)来实现。我们可以为ListView的ItemContainerStyle属性添加一个样式(Style),并在该样式内使用触发器来根据条件设置行的背景颜色。 以下是一个示例代码: ```xml <ListView ItemsSource="{Binding YourDataSource}"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Style.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="0"> <Setter Property="Background" Value="LightGray"/> </Trigger> <Trigger Property="ItemsControl.AlternationIndex" Value="1"> <Setter Property="Background" Value="White"/> </Trigger> </Style.Triggers> </Style> </ListView.ItemContainerStyle> </ListView> ``` 在上述代码中,我们使用了AlternationIndex属性来为交替的行设置不同的背景颜色。AlternationIndex属性将自动递增并应用于ListView的每一行。通过将AlternationIndex的值与触发器中的值匹配,我们可以为奇数行和偶数行分别设置不同的背景颜色。 在示例中,我们为奇数行设置了浅灰色(LightGray)的背景颜色,偶数行设置了白色(White)的背景颜色。你可以根据需要自定义触发器的条件和背景颜色。 通过这种方式,我们可以自定义ListView行的背景颜色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code bean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值