代码之家  ›  专栏  ›  技术社区  ›  Christian

更改WPF ListViewItem的选择颜色

  •  12
  • Christian  · 技术社区  · 14 年前

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

    在我的XAML中,我已经实现了这一点:

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

    不幸的是,这不起作用。它只是简单地把选择变成白色而不是蓝色。

    有人有主意吗?

    最美好的祝福, 基督教的

    编辑: 样例代码:

    <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 回复  |  直到 5 年前
        1
  •  27
  •   Fredrik Hedblad    14 年前

    我不知道你说的白色而不是蓝色是什么意思。当选择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>
    
        2
  •  5
  •   Ahmad    9 年前

    看看这个: 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> 
    
        3
  •  0
  •   jjrdk    14 年前

    我通常在ListView的资源集合中定义该颜色。然后,对于每个项目,我可以定义一个具有我喜欢的颜色的模板,当我选择时,我不会得到蓝色。

    不过,我认为你应该有某种迹象表明某个项目是被选中的。

        4
  •  0
  •   Val    7 年前

    对于禁用非活动样式,

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