【问题标题】:Alternate background color in Listview XAMLListview XAML 中的备用背景颜色
【发布时间】:2012-09-29 13:35:52
【问题描述】:

我正在使用基于 itemTemplate 的 listView。 所以我需要在我的模板中交替背景颜色:
- 拳头排:白色
- 第二行:灰色
- 第三行:白色
- 第四:灰色

这是我的模板:

     <DataTemplate x:Key="ItemFlight" >
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="60"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Border Background="#28AADB" Margin="2">
                <Image Source="{Binding Path=IsArrival, Converter={StaticResource BooleanToImageDisplayConverter}}" Width="30" Height="30" VerticalAlignment="Center" Margin="5"/>
            </Border>
            <Grid Grid.Column="1" VerticalAlignment="Center">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="4*"/>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="3*"/>
                    <ColumnDefinition Width="6*"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <TextBlock Text="{Binding FlightName}" FontWeight="Bold" Grid.Column="0" Grid.Row="0"  Margin="10" Style="{StaticResource MyTextBlockStyle}"/>

                <TextBlock Text="{Binding ArrivalOrDepartDateTime, Converter={StaticResource DateTimeConverter}}"  FontWeight="Bold" Grid.Column="0" Grid.Row="1" Margin="10" Style="{StaticResource MyTextBlockStyle}"/>

                <TextBlock Text="{Binding Terminal, Converter={StaticResource StringUpperConverter}}" Grid.Column="1" Grid.Row="0" Margin="10"  Visibility="{Binding Path=IsArrival,Converter={StaticResource BooleanToVisibilityReverseConverter}}" Style="{StaticResource MyTextBlockStyle}"/>
                <TextBlock Text="{Binding CityInfo.Name}" Grid.Column="1" Grid.Row="0" Margin="10" Visibility="{Binding Path=IsArrival,Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource MyTextBlockStyle}"/>

                <TextBlock Text="{Binding DepartureTime}"  Grid.Column="1" Grid.Row="1" Margin="10" Style="{StaticResource MyTextBlockStyle}"/>

                <TextBlock Text="{Binding CityInfo.Name}" Grid.Column="2" Grid.Row="0" Margin="10" Style="{StaticResource MyTextBlockStyle}"  Visibility="{Binding Path=IsArrival,Converter={StaticResource BooleanToVisibilityReverseConverter}}"/>
                <TextBlock Text="{Binding Terminal, Converter={StaticResource StringUpperConverter}}"  Visibility="{Binding Path=IsArrival,Converter={StaticResource BooleanToVisibilityConverter}}" Grid.Column="2" Grid.Row="0" Margin="10" Style="{StaticResource MyTextBlockStyle}"/>

                <TextBlock Text="{Binding ArrivalTime}" Grid.Column="2" Grid.Row="1" Margin="10" Style="{StaticResource MyTextBlockStyle}"/>

                <TextBlock Text="{Binding Status}" Grid.Column="3" Grid.Row="0" Grid.RowSpan="2" Margin="15" Style="{StaticResource MyTextBlockStyle}"  Foreground="#EA6A1E" FontSize="20" TextWrapping="Wrap" />

            </Grid>
        </Grid>
    </DataTemplate>

请问我该怎么做??

【问题讨论】:

标签: wpf silverlight xaml listview microsoft-metro


【解决方案1】:

为了更清楚地查看选定的线条,你可以试试这个:(不要在意颜色和最终渲染,我没有花必要的时间让它变得性感)

<Grid DataContext="{StaticResource MainWindowViewModel}">
    <Grid.Resources>
        <local:FalseToCollapsedConverter x:Key="FalseToCollapsedConverter" />
    </Grid.Resources>
    <ListView ItemsSource="{Binding Items}" AlternationCount="2" HorizontalContentAlignment="Stretch">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel />
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <Grid x:Name="line">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*" />
                                    <ColumnDefinition Width="Auto" />
                                </Grid.ColumnDefinitions>
                                <ContentControl Content="{Binding .}" Margin="4" />
                                <TextBlock Grid.Column="1" Text="V" Margin="4" Visibility="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem, Mode=FindAncestor}, Converter={StaticResource FalseToCollapsedConverter}}" />
                                <Border Grid.ColumnSpan="2" Background="#5500FF00" 
                                        BorderBrush="Blue" BorderThickness="2"
                                        Visibility="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem, Mode=FindAncestor}, Converter={StaticResource FalseToCollapsedConverter}}" />
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsSelected" Value="True">
                                    <Setter Property="FontWeight" Value="Bold" />
                                </Trigger>
                                <Trigger Property="ItemsControl.AlternationIndex"  Value="0">
                                    <Setter TargetName="line" Property="Background" Value="#CCCCFF" />
                                </Trigger>
                                <Trigger Property="ItemsControl.AlternationIndex"  Value="1">
                                    <Setter TargetName="line" Property="Background" Value="#CCFFCC" />
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.Resources>
    </ListView>
</Grid>

【讨论】:

    【解决方案2】:

    您应该使用 AlternationCount 属性,它适用于 ListBox、ListView 或任何其他从 ItemsControl 继承的控件。 属性定义和两个示例包含在
    https://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.alternationcount%28v=vs.110%29.aspx)

    【讨论】:

      【解决方案3】:

      我试过了,它对我有用。

      <Window x:Class="TryResponses.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:vm="clr-namespace:TryResponses"
          xmlns:system="clr-namespace:System;assembly=mscorlib"
          Title="MainWindow" Height="350" Width="525">
      <Window.Resources>
          <vm:MainWindowViewModel x:Key="MainWindowViewModel" />
      </Window.Resources>
      <Grid Background="LightGray" DataContext="{StaticResource MainWindowViewModel}">
          <Grid.Resources>
              <Style TargetType="ListViewItem">
                  <Style.Triggers>
                      <Trigger Property="ItemsControl.AlternationIndex"  Value="0">
                          <Setter Property="Background" Value="LightBlue" />
                      </Trigger>
                      <Trigger Property="ItemsControl.AlternationIndex"  Value="1">
                          <Setter Property="Background" Value="LightGray" />
                      </Trigger>
                  </Style.Triggers>
              </Style>
              <DataTemplate DataType="system:String">
                  <!-- put your data template here -->
              </DataTemplate>
          </Grid.Resources>
          <ListView ItemsSource="{Binding Items}" AlternationCount="2" />
      </Grid>
      

      我希望这会有所帮助。

      问候

      克劳德

      【讨论】:

      • 它对我不起作用。你能检查我的问题是否相同的a5t stackoverflow.com/questions/24990609/…
      • 此解决方案运行良好。确保在收集控件上设置交替计数。我在我的 Listview 上将样式触发器添加到 ListView.ItemContainerStyle。谢谢!
      • 效果很好!谢谢。
      • 这行得通,但现在选择一行看起来很奇怪,一半的行变亮,一半没有。并不清楚选择了什么
      • 在下面查看我的新帖子
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 1970-01-01
      • 2019-11-02
      • 2023-03-06
      • 2018-02-27
      • 1970-01-01
      相关资源
      最近更新 更多