2009-05-21 7 views
2

Je joue autour avec WPF et j'ai vu l'article suivant: WPF ListView Inactive Selection Colorcouleur de sélection Listview

Je veux faire quelque chose de similaire. Je veux mettre une bordure autour d'un listviewitem quand il est sélectionné et je ne veux pas changer la couleur d'arrière-plan. La raison pour laquelle je veux ceci est que je veux une liste de couleurs codée et je veux toujours voir la couleur quand il est sélectionné, mais je veux savoir qu'il est sélectionné en ayant une bordure autour d'elle.

Des idées?

MISE À JOUR:

J'ai essayé la réponse ci-dessous et il m'a fait à mi-chemin, il ne met une bordure autour du ListViewItem, mais elle remplace ma couleur d'arrière-plan. Je ne peux pas la bonne syntaxe j'ai essayé (Remarquez le BasedOn):

<Style x:Key="SourceListView" TargetType="{x:Type ListViewItem}"> 
     <Setter Property="Background" Value="{Binding SourceType, Converter={StaticResource SourceGroupConverter}}"/> 
    </Style> 

    <Style x:Key="MyListViewItemStyle" TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource SourceListView}" > 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListViewItem}"> 
        <Border 
          x:Name="Border" 
          BorderBrush="Transparent" 
          BorderThickness="1"> 
         <GridViewRowPresenter Columns="{TemplateBinding GridView.ColumnCollection}" Content="{TemplateBinding Content}"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter TargetName="Border" Property="BorderBrush" Value="Black"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

J'ai ensuite essayé ceci:

<Style x:Key="MyListViewItemStyle" TargetType="{x:Type ListViewItem}"> 
     <Setter Property="Background" Value="{Binding SourceType, Converter={StaticResource SourceGroupConverter}}"/> 
     <Setter Property="Template"> 
      ...//Same as above 
     </Setter> 
    </Style> 

Les deux tentatives juste comme arrière-plan que je fais blanc (ou transparent non connaître). Je sais que c'est juste la syntaxe et j'apprécierais un autre coup de pouce dans la bonne direction :)

Répondre

4

Modifiez ItemContainerStyle sur le ListView à un style qui ne change pas l'arrière-plan lorsqu'un élément est sélectionné mais change la couleur d'un frontière. Voici un exemple:

<Style x:Key="MyListViewItemStyle" TargetType="{x:Type ListViewItem}"> 
    <Setter Property="Background" Value="{Binding SourceType, Converter={StaticResource SourceGroupConverter}}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ListViewItem}"> 
       <Border 
       x:Name="Border" 
       BorderBrush="Transparent" 
       BorderThickness="1" 
       Background="{TemplateBinding Background}"> 
       <GridViewRowPresenter Columns="{TemplateBinding GridView.ColumnCollection}" Content="{TemplateBinding Content}"/> 
       </Border> 
       <ControlTemplate.Triggers> 
       <Trigger Property="IsSelected" Value="true"> 
        <Setter TargetName="Border" Property="BorderBrush" Value="Black"/> 
       </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

Et puis utilisez le style comme ceci:

<ListView ItemContainerStyle="{StaticResource MyListViewItemStyle}"> 
    ... 
</ListView> 
+0

J'ai essayé et il ne mis une frontière, mais il semble ma syntaxe pour la couleur de fond est surchargée. Plus d'aide? Une autre chose que j'ai remarquée est que la listview n'est sélectionnée que si vous cliquez sur une zone non-blanche (par exemple, cliquez sur le contenu d'une colonne) de la liste avec le style ci-dessus. Pourquoi est-ce? – Jose

+0

J'ai mis à jour mon exemple de code. J'ai ajouté un TemplateBinding à la propriété Background de la bordure à la propriété background de ListViewItem. Je ne sais pas pourquoi il se comporte comme si vous expliquiez avec la sélection. J'ai essayé mon exemple et je peux cliquer sur un espace vide sur une rangée et toujours le sélectionner. –

+0

Bonne explication. – abhishek