WPF TreeView: Comment le style des éléments sélectionnés, avec des coins arrondis comme dans l'Explorateur
L'élément sélectionné dans une WPF TreeView a un fond bleu foncé, avec "sharp" coins. Qui ressemble un peu daté aujourd'hui:
Je voudrais changer l'arrière-plan ressembler dans l'Explorateur de Windows 7 (avec/sans accent):
Ce que j'ai essayé jusqu'à présent n'a pas de supprimer l'original sur fond bleu foncé, mais les peintures d'une bordure arrondie sur le dessus de sorte que vous voyez la couleur bleu foncé sur les bords et sur le côté gauche moche.
Fait intéressant, lorsque ma version n'a pas le focus, il semble assez OK:
Je tiens à s'abstenir de redéfinir le modèle de contrôle comme illustré ici ou ici. Je veux mettre le minimum propriétés requises pour faire de l'élément sélectionné ressembler à Explorer.
Alternative: je serais également heureux d'avoir l'concentre l'élément sélectionné ressembler à la mienne maintenant, quand il n'a pas le focus. Quand il perd le focus, doit changer de couleur du bleu au gris.
Voici mon code:
<TreeView
x:Name="TreeView"
ItemsSource="{Binding TopLevelNodes}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="#FF7DA2CE" />
<Setter Property="Background" Value="#FFCCE2FC" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type viewmodels:ObjectBaseViewModel}" ItemsSource="{Binding Children}">
<Border Name="ItemBorder" CornerRadius="2" Background="{Binding Background, RelativeSource={RelativeSource AncestorType=TreeViewItem}}"
BorderBrush="{Binding BorderBrush, RelativeSource={RelativeSource AncestorType=TreeViewItem}}" BorderThickness="1">
<StackPanel Orientation="Horizontal" Margin="2">
<Image Name="icon" Source="/ExplorerTreeView/Images/folder.png"/>
<TextBlock Text="{Binding Name}"/>
</StackPanel>
</Border>
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
Solution
Avec les excellentes réponses de Sheridan et Meleak mon TreeView ressemble maintenant à ceci dans le code (en conséquence, je suis très heureux avec et qui est assez proche de l'Explorateur de style):
<TreeView
...
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<!-- Style for the selected item -->
<Setter Property="BorderThickness" Value="1"/>
<Style.Triggers>
<!-- Selected and has focus -->
<Trigger Property="IsSelected" Value="True">
<Setter Property="BorderBrush" Value="#7DA2CE"/>
</Trigger>
<!-- Mouse over -->
<Trigger Property="helpers:TreeView_IsMouseDirectlyOverItem.IsMouseDirectlyOverItem" Value="True">
<Setter Property="Background">
<Setter.Value>
<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFFAFBFD" Offset="0"/>
<GradientStop Color="#FFEBF3FD" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="BorderBrush" Value="#B8D6FB"/>
</Trigger>
<!-- Selected but does not have the focus -->
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsSelected" Value="True"/>
<Condition Property="IsSelectionActive" Value="False"/>
</MultiTrigger.Conditions>
<Setter Property="BorderBrush" Value="#D9D9D9"/>
</MultiTrigger>
</Style.Triggers>
<Style.Resources>
<Style TargetType="Border">
<Setter Property="CornerRadius" Value="2"/>
</Style>
</Style.Resources>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type viewmodels:ObjectBaseViewModel}" ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal" Margin="2,1,5,2">
<Grid Margin="0,0,3,0">
<Image Name="icon" Source="/ExplorerTreeView/Images/folder.png"/>
</Grid>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
<!-- Brushes for the selected item -->
<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFDCEBFC" Offset="0"/>
<GradientStop Color="#FFC1DBFC" Offset="1"/>
</LinearGradientBrush>
<LinearGradientBrush x:Key="{x:Static SystemColors.ControlBrushKey}" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#FFF8F8F8" Offset="0"/>
<GradientStop Color="#FFE5E5E5" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
</TreeView.Resources>
</TreeView>
- pouvez-vous montrer le code pour TreeView_IsMouseDirectlyOverItem.IsMouseDirectlyOverItem ?
- blogs.msdn.com/b/mikehillberg/archive/2006/09/21/...
- merci, j'ai réussi à trouver moi-même un certain temps après avoir demandé - mais apprécie tout de même
- En Quelque Sorte SystemColors.ControlTextBrushKey inactif, la sélection ne fonctionne pas pour moi. J'utilise SystemColors.InactiveSelectionHighlightTextBrushkey à la place. J'ai windows 7 SP1.
Vous devez vous connecter pour publier un commentaire.
L'ajout de @Sheridan réponse
Ce n'est pas précis à 100%, mais devrait vous obtenir assez proche (c'est en utilisant les couleurs de
GridView
qui est assez proche de l'Explorateur Windows)Ajouter ceci dans votre
TreeView.ContainerStyle
pour supprimer la valeur par défautblue
arrière-plan.Vous pouvez remplacer le
Black
avec quelle que soit la couleur que vous voulez que votre texte d'un élément et l'élément sélectionné de texte.D'avoir un fond gris, quand elle n'est pas centrée, vous pourriez mettre en place un "porté"
Style
avec un gris backgorund et l'utilisationEventTrigger
s sur leTreeViewItem.GotFocus
etLostFocus
événements pour basculer entre lesStyle
s.EDIT>>>
Si vous souhaitez flash, vous pouvez utiliser des animations pour changer entre les couleurs d'arrière-plan par l'ajout d'éléments déclencheurs pour votre
ItemBorder Border
directement dans votreHierarchicalDataTemplate
comme suit:Noter que cela ne fonctionne que si le
ColorAnimation
a unFrom
couleur. Comme ce code est, le runtime recherchez unSolidColorBrush
ensemble sur leBorder.Background
de la propriété, de sorte que vous devez définir un. Vous pouvez définir laColorAnimation.From
propriété directement à la place.Windows 10 TreeView (et ListView) Style
J'ai été à l'origine la recherche d'un moyen pour appliquer le Windows 10 schéma de couleur pour un TreeViewItem, y compris
Si vous êtes à la recherche d'exactement cela, n'hésitez pas à prendre le code ci-dessous. J'ai utilisé Helge Klein solution pour la IsMouseOver question et a appliqué le Windows 10 couleurs pour le XAML. Donc je propose cela comme un ajout à la accepté de répondre.
Aussi, voir ci-dessous pour un mot sur
ListView
etComboBox
ainsi.Capture d'écran
App.xaml
TreeViewItemHelper (Source posté par Helge Klein, des modifications mineures /simplification)
ListBox/ListView et de la zone de liste déroulante: Dans Windows 7 (et 8?), ce sera la cause de la conception de TreeView à ListBox/ListView et ComboBox diffèrent. Par conséquent, si vous souhaitez appliquer ce schéma de couleur pour ces types de contrôle aussi bien, aussi, utiliser ceci: