web-dev-qa-db-fra.com

Changer la couleur de sélection de WPF ListViewItem

J'ai un ListView contenant des ListViewItems. Par défaut, la sélection d'éléments crée un fond bleu profond. J'aimerais appliquer un style tel que la sélection d'un élément ne change pas son apparence.

Dans mon xaml, j'ai déjà réalisé ceci:

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

Malheureusement, cela ne fait pas l'affaire. Cela rend simplement la sélection blanche au lieu de bleue.

Est-ce que quelqu'un a une idée?

Meilleurs voeux, Christian

EDIT: Exemple de code:

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

Pour reproduire cela, vous devrez peut-être définir la couleur d'arrière-plan d'un seul ListViewItem sur quelque chose comme vert ou rouge.

12
Christian

Je ne suis pas sûr de comprendre ce que vous entendez par blanc au lieu de bleu. Lorsqu'un ListViewItem est sélectionné, l'avant-plan et l'arrière-plan sont modifiés par un déclencheur. Pour changer le premier plan d'un ListViewItem, vous pouvez utiliser ceci

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

Mettre à jour

Essayez ceci pour re-templates. J'ai supprimé tous les déclencheurs de la sélection

<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>
27
Fredrik Hedblad

Regardez ceci: http://www.wpftutorial.net/ListBoxSelectionBackground.html ou http://dotnetbutchering.blogspot.be/2009/08/how-to-set-wpf-listview- selected-item.html - le même principe s'applique au contrôle ListView.

Par exemple, le code basé sur les déclencheurs suivant devrait faire l'affaire et n'imiter aucun changement de couleur lorsque la sélection est modifiée.

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

Ce que je fais normalement est de définir cette couleur dans la collection de ressources de listview. Ensuite, pour chaque élément, je peux définir un modèle avec les couleurs qui me plaisent et lorsque je sélectionne, je ne reçois pas le bleu.

Je pense cependant que vous devriez avoir une sorte d'indication qu'un élément est sélectionné.

0
jjrdk

Pour désactiver également le style inactif,

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