2010-11-22 4 views
12

J'ai un ListView contenant certains ListViewItems. Par défaut, la sélection d'éléments rend leur arrière-plan bleu foncé. Je voudrais appliquer un style tel que la sélection d'un élément ne change pas son apparence.Modifier la couleur de sélection de WPF ListViewItem

Dans mon XAML je l'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> 

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

Répondre

27

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

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

Mise à jour

Essayez ceci pour re-templating. J'ai enlevé tous les déclencheurs pour une 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> 
+0

Merci pour la réponse rapide. J'ai essayé votre code et il me donne presque ce que je veux. Cependant: Avant de cliquer sur les éléments, ils ont déjà une couleur de fond. Certains d'entre eux sont verts, certains sont rouges, d'autres jaunes et d'autres orange. Maintenant, quand je sélectionne un certain nombre d'entre eux, ils deviennent tous blancs. Blanc à cause du "Transparent" dans votre code. Si je change Transparent en noir, ils deviennent tous noirs. Ce que je voudrais réaliser, c'est qu'ils restent la même couleur qu'avant. Est-ce possible? Comme pour dire la ressource de style que lors de la sélection, il ne devrait pas changer le "HighlightBurshKey"? – Christian

0

Ce que je fais habituellement est de définir cette couleur dans la collection de ressources de listview. Ensuite, pour chaque article, je peux définir un modèle avec les couleurs que j'aime et quand je sélectionne, je ne reçois pas le bleu.

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

+0

Je ne comprends pas très bien ce que vous voulez dire par l'indication qu'un élément est sélectionné? Ce que je veux, c'est qu'il n'y ait pas de différence visuelle entre un élément sélectionné et un non-sélectionné. Je sais que cela semble étrange, mais la raison pour laquelle je veux ceci est parce que dans le ListView j'ai une colonne nommée "checked" qui contient une case à cocher et cette case est mon indication pour une ligne sélectionnée. – Christian

5

Jetez un oeil à 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 pour le contrôle ListView. Par exemple, le code basé sur les déclencheurs suivant devrait faire l'affaire et imiter aucun changement de couleur lorsque la sélection est changé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> 
Questions connexes