Le moyen le plus simple de procéder consiste à fournir un modèle pour la propriété "ItemContainerStyle" et NON pour la propriété "ItemTemplate". Dans le code ci-dessous, je crée 2 modèles de données: un pour les états "non sélectionnés" et un pour les états "sélectionnés". Je crée ensuite un modèle pour le "ItemContainerStyle" qui est le "ListBoxItem" réel qui contient l'élément. J'ai mis le "ContentTemplate" par défaut à l'état "Unselected", puis je fournis un déclencheur qui permute le modèle lorsque la propriété "IsSelected" est vraie. (Remarque: je suis en train de définir la propriété "ItemsSource" dans le code derrière une liste de chaînes pour plus de simplicité)
<Window.Resources>
<DataTemplate x:Key="ItemTemplate">
<TextBlock Text="{Binding}" Foreground="Red" />
</DataTemplate>
<DataTemplate x:Key="SelectedTemplate">
<TextBlock Text="{Binding}" Foreground="White" />
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}" x:Key="ContainerStyle">
<Setter Property="ContentTemplate" Value="{StaticResource ItemTemplate}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="ContentTemplate" Value="{StaticResource SelectedTemplate}" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<ListBox x:Name="lstItems" ItemContainerStyle="{StaticResource ContainerStyle}" />
BasedOn="{StaticResource {x:Type ListBoxItem}}"
avec ListBox. Cela s'applique également à d'autres contrôles tels que TreeView.Pour définir le style lorsque l'élément est sélectionné ou pas, tout ce que vous avez à faire est de récupérer le
ListBoxItem
parent dans votre<DataTemplate>
et de déclencher les changements de style lorsque celui-ciIsSelected
change. Par exemple, le code ci-dessous créera unTextBlock
avec laForeground
couleur par défaut verte . Maintenant, si l'élément est sélectionné, la police deviendra rouge et lorsque la souris sera sur l'élément deviendra jaune . De cette façon, vous n'avez pas besoin de spécifier des modèles de données séparés comme suggéré dans d'autres réponses pour chaque état que vous souhaitez modifier légèrement.la source
Il convient également de noter que le stackpanel n'est pas focalisable, donc il ne le sera jamais (définissez Focusable = True si vous / vraiment / voulez qu'il soit concentré). Cependant, la clé à retenir dans des scénarios comme celui-ci est que le Stackpanel est l' enfant de TreeViewItem, qui est le ItemContainer dans ce cas. Comme le suggère Micah, peaufiner le style du conteneur est une bonne approche.
Vous pouvez probablement le faire à l'aide de DataTemplates et de choses telles que des déclencheurs de données qui utiliseraient l'extension de balisage RelativeSouce pour rechercher l'élément listview
la source