更改 WPF ListViewItem 的选择颜色

21

我有一个包含一些ListViewItems的ListView。默认情况下,选择项目会使它们的背景变为深蓝色。我想应用样式,使选择项不改变其外观。

在我的xaml中,我已经实现了这个目标:

<Style TargetType="ListViewItem">
   <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
   </Style.Resources>
</Style>

很遗憾,这并没有起到作用。它只是将选择白色而非蓝色。

有人有什么想法吗?

最好的祝福, Christian

编辑: 示例代码:

<Window.Resources>
    <Style TargetType="ListViewItem">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black"/>                      
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
        </Style.Resources>
    </Style>
</Window.Resources>



<ListView x:Name="lvTestRun" ItemsSource="{Binding Path=TestRunData}" Margin="177,26,8,53.277" SelectionMode="Multiple">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Status"/>
            <GridViewColumn Header="Duration"/>
            <GridViewColumn Header="Start Time"/>
            <GridViewColumn Header="End Time"/>
        </GridView>
    </ListView.View>
</ListView>
为了重现这个问题,您可能需要将单个ListViewItem的背景颜色设置为绿色或红色之类的颜色。
4个回答

31

我不确定我理解您所说的白色而不是蓝色的意思。当选中ListViewItem时,通过触发器更改前景和背景。要更改ListViewItem的前景色,可以使用以下代码:

<ListView ...>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Resources>
                <!-- Foreground for Selected ListViewItem -->
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
                                 Color="Black"/>
                <!-- Background for Selected ListViewItem -->
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                                 Color="Transparent"/>
            </Style.Resources>
        </Style>
    </ListView.ItemContainerStyle>
    ...
</ListView>

更新

尝试使用以下方法进行重新模板化。我删除了所有选定触发器。

<ListView ...>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Style.Resources>
                <LinearGradientBrush x:Key="ListItemHoverFill" EndPoint="0,1" StartPoint="0,0">
                    <GradientStop Color="#FFF1FBFF" Offset="0"/>
                    <GradientStop Color="#FFD5F1FE" Offset="1"/>
                </LinearGradientBrush>
            </Style.Resources>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ListViewItem}">
                        <Border CornerRadius="2" SnapsToDevicePixels="True"  
                                BorderThickness="{TemplateBinding BorderThickness}"   
                                BorderBrush="{TemplateBinding BorderBrush}"   
                                Background="{TemplateBinding Background}">
                            <Border Name="InnerBorder" CornerRadius="1" BorderThickness="1">
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition MaxHeight="11" />
                                        <RowDefinition />
                                    </Grid.RowDefinitions>

                                    <Rectangle Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF" />
                                    <GridViewRowPresenter Grid.RowSpan="2"   
                                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"   
                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                </Grid>
                            </Border>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Background" Value="{StaticResource ListItemHoverFill}" />
                                <Setter Property="BorderBrush" Value="#FFCCF0FF" />
                                <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" />
                            </Trigger>
                            <!--<Trigger Property="IsSelected" Value="True">
                                <Setter Property="Background" Value="{StaticResource ListItemSelectedFill}" />
                                <Setter Property="BorderBrush" Value="#FF98DDFB" />
                                <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#80FFFFFF" />
                                <Setter TargetName="UpperHighlight" Property="Visibility" Value="Visible" />
                                <Setter TargetName="UpperHighlight" Property="Fill" Value="#40FFFFFF" />
                            </Trigger>-->
                            <!--<MultiTrigger> 
                <MultiTrigger.Conditions> 
                    <Condition Property="IsSelected" Value="True" /> 
                    <Condition Property="Selector.IsSelectionActive" Value="False" /> 
                </MultiTrigger.Conditions> 
                <Setter Property="Background" Value="{StaticResource ListItemSelectedInactiveFill}" /> 
                <Setter Property="BorderBrush" Value="#FFCFCFCF" /> 
            </MultiTrigger>-->
                            <!--<MultiTrigger>
                                <MultiTrigger.Conditions>
                                    <Condition Property="IsSelected" Value="True" />
                                    <Condition Property="IsMouseOver" Value="True" />
                                </MultiTrigger.Conditions>
                                <Setter Property="Background" Value="{StaticResource ListItemSelectedHoverFill}" />
                                <Setter Property="BorderBrush" Value="#FF98DDFB" />
                            </MultiTrigger>-->
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

感谢您的快速回复。我尝试了您的代码,它几乎给了我想要的结果。但是:在单击这些项目之前,它们已经有了背景颜色。其中一些是绿色的,一些是红色的,一些是黄色的,一些是橙色的。现在当我选择其中一些时,它们全部变成了白色。这是因为您的代码中有"Transparent"。如果我将"Transparent"更改为"Black",它们就会全部变成黑色。我想要实现的是,它们保持与之前相同的颜色。这是否可能?也就是告诉样式资源,在选择时不要更改"HighlightBurshKey"? - Christian

13

请参考以下链接:http://www.wpftutorial.net/ListBoxSelectionBackground.html或者http://dotnetbutchering.blogspot.be/2009/08/how-to-set-wpf-listview-selected-item.html,同样的原则适用于ListView控件。

例如,下面基于触发器的代码应该能解决问题并在更改选择时模拟不更改颜色的效果。

<Style TargetType="{x:Type ListViewItem}">
   <Style.Triggers>
      <Trigger Property="IsSelected" Value="true" >
        <Setter Property="Foreground" Value="YourForegroundColour" />
        <Setter Property="Background" Value="YourBackgroundColour" />
      </Trigger>
   </Style.Triggers>
</Style> 

0
我通常会在listview的资源集合中定义颜色。然后,对于每个项目,我可以定义一个模板,其中包含我喜欢的颜色,当我选择时,就不会出现蓝色。
不过,我认为你应该有某种指示,表明已选择了某个项目。

我不太明白您所说的“指示已选择项目”的含义是什么?我的意思是选择的项目和未选择的项目之间没有视觉上的区别。我知道这听起来很奇怪,但我这样做的原因是在 ListView 中我有一个名为“checked”的列,其中包含复选框,而这个复选框是我选择行的指示。 - Christian

0

同时禁用不活动的样式:

<Style TargetType="ListViewItem">
    <Style.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent" />
    </Style.Resources>
</Style>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接