2009-08-09 8 views
8

Je possède WPF ListView avec vue GridView et je souhaite supprimer toute trace de surbrillance de ligne.Suppression de WPF ListView/GridView highlight chrome

Cette pièce utile du code peut être trouvé dans une réponse sur ce site:

 <ListView.ItemContainerStyle> 
     <Style TargetType="{x:Type ListViewItem}"> 
      <Setter Property="Control.Focusable" Value="False"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="{x:Null}" /> 
       <Setter Property="BorderBrush" Value="{x:Null}" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListView.ItemContainerStyle> 

Cependant, alors que ce changement contribue à éliminer la plupart du temps fort, il ne supprime pas la barre horizontale qui apparaît encore quand la souris se déplace sur la ligne ListView. Comment puis-je l'enlever?

J'ai traité le problème similaire impliquant Button et trouvé une solution qui change Button en supprimant son chrome.

Dans ce cas de ListView/GridView, je n'arrive pas à trouver le chrome et le gabarit à modifier.

Répondre

14

Si vous avez le SDK de Windows installé, vous pouvez trouver la source XAML pour tous les styles par défaut (en supposant installé les échantillons) dans:

% ProgramFiles% \ Microsoft SDKs \ Windows \ v6.1 \ Samples \ WPFSamples.zip

Le fichier zip contient un dossier Core contenant AeroTheme, LunaTheme etc qui contient la source des styles par défaut. Malheureusement ces fichiers sont assez volumineux (~ 8500 lignes pour Aero) et pas très bien structurés ou formatés (IMO).

Le modèle de contrôle par défaut pour un ListViewItem ressemble à ceci:

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

Votre meilleur pari pour enlever toute évidence est probablement remplacer le ControlTemplate avec vous possédez qui comprend tout le GridViewRowPresenter (peut-être dans une seule frontière) . N'oubliez pas d'inclure le déclencheur qui grise les éléments lorsque le contrôle est désactivé.

+0

Le point culminant doit être cela! Je regardais le modèle ici: http://msdn.microsoft.com/en-us/library/ms788717.aspx et comme il doit être pour un thème différent, je ne pouvais pas expliquer la barre. – Tony

+0

Je peux confirmer que le rectangle UpperHighlight était le coupable. Merci! – Tony

+2

Incroyable ... seulement dans WPF ai-je dû remplacer complètement un style pour se débarrasser d'un seul élément de surbrillance. – aqua

0

En utilisant votre code, je ne vois aucune ligne. Quel est votre thème par défaut en ce moment? Luna, Aero, etc.? Il se pourrait que le vôtre soit différent du mien, donc une différence de chrome. Y a-t-il d'autres paramètres particuliers sur votre ListView?

Style Snooper ou Show Me The Template peut vous aider à retrouver l'élément visuel responsable de la ligne que vous voyez. Vous pouvez également être intéressé par re-templating votre ListView pour obtenir l'effet que vous voulez.

+0

C'est le thème Vista, je crois que c'est Aero car j'ai des effets de verre. En effet, les gens sur XP ne voient pas la barre de surbrillance. – Tony

8

Je ne suis pas devant un PC Windows pour tester ce moment mais j'ai eu un problème similaire avec listboxes que je fixai en mettant ce qui suit dans mes Window.Resources

<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 

Je ne sais pas si elle travaillera avec votre listview si.

+1

Plusieurs blogs et anwers pointent vers cette méthode mais, pour une raison quelconque, ça n'a jamais marché pour moi. – Tony

+3

Merci! Cela a fonctionné pour moi quand je l'ai mis dans mes ressources de fenêtre avec le style targetType = "ListViewItem". J'ai également ajouté une ligne pour définir le SystemColors.HighlightTextBrushKey à SystemColors.WindowTextColor sinon pour empêcher ma couleur de texte de passer à la couleur d'arrière-plan (et donc de disparaître). –

+0

Pour moi cela fonctionne sur ListView withOUT Gridview. Mais PAS avec Gridview. – Paparazzi