Mettez en surbrillance l'ensemble TreeViewItem ligne en WPF
Si j'ai mis TreeViewItem Contexte, il souligne l'en-tête uniquement. Comment puis-je mettre en évidence l'ensemble de la ligne?
J'ai trouvé un post presque la résolution d'un problème http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b04f73e2-0b10-4d97-a6da-64df2e30c21d/
Mais il y a quelques problèmes:
1. Il ne permet pas de mettre en évidence l'ensemble de la ligne
2. L'arbre a XP sur Vista. Je doit comme il regarde de la même façon sur Vista comme il était, mais si l'utilisateur a changé le thème pour XP il faut XP manière.
3. Donc, beaucoup de XAML...
Toutes les idées, ce que je dois chercher?
Vous devez vous connecter pour publier un commentaire.
Ici, nous allons, troisième fois un charme. Si vous voulez quelque chose qui ressemble à ceci.
Celui-ci prend un peu plus de travail. Je suis sûr qu'il ya beaucoup de façons de le faire, mais cette méthode utilise un Convertisseur de Longueur et un TreeViewItem méthode d'extension pour obtenir la Profondeur. Ces deux sont étroitement couplée à la TreeViewItem visuelle de l'arbre, de sorte que si vous commencez à jouer avec les Modèles, alors vous pourriez avoir des ennuis. Encore une fois, c'est la partie importante, et ci-dessous le code complet.
TreeViewDepth Extension
LeftMarginMultiplierConverter
Contrôle
Plein TreeViewItem Style
Parent
propriété n'est pas définie sur leTreeViewItem
. J'ai édité la réponse d'utiliser à la place de l'arborescence visuelle pour travailler le parent qui résout le problème (au moins pour moi), n'hésitez pas à le restaurer si vous avez des objections si.TreeViewItem d'en-Tête ne s'étire pas?
Ce problème se produit parce que WPF modèle par défaut pour
TreeViewItem
est mis en place un 3-colonne 2-ligneGrid
. La première ligne est pour "en-tête" (en fait unBorder
), et la deuxième ligne est pour leItemsPresenter
. Les deux lignes sont visibles ou cachés que nécessaire, afin de réaliser l'arbre d'expansion lorsque vous cliquez sur le petit triangle--qui occupe la colonne zéro de laGrid
.Les deux lignes vraiment seulement besoin d'une colonne supplémentaire. Par exemple, dans la deuxième ligne, nous devons avoir rien à col-0, ligne 1, parce que la partie vide doit être mis en retrait lors de la
IsExpanded
est vrai. Mais le mystère commence quand on remarque que leItemsPresenter
, basé dans le col-1, ligne 1, spécifieGrid.ColumnSpan=2
.Malheureusement dans la rangée du haut, le
Border
qui contient l'en-tête est défini àGrid.Column=1
... mais pas de ColumnSpan. Depuis le col-2 de laGrid
aWidth=*
cela signifie que l'en-tête ou à la frontière de ne pas étirer horizontalement.En d'autres termes, je me semble que le 3-colonne de la conception de la grille n'a pas de fin, sauf pour prévenir l'en-tête de l'étirement. Pour autant que je puisse dire, une simple 2x2 arrangement serait plus souple [edit: voir note de bas de page n ° 2], et le soutien plein étirement ou l' 'irréguliers' en-tête non-étirement, via le régulier
WPF
mécanismes d'alignement.Idéalement, nous aimerions changer le
Grid
à seulement 2 colonnes au lieu de 3. Puisque ce n'est pas si facile, au lieu de cela, nous allons l'en-tête span 2 colonnes, tout comme leItemsPresenter
n'.Ok, voici une petit, complet, indépendant (XAML seulement) programme de travail qui démontre--et des corrections--le problème:
Si vous exécutez ce programme, comme indiqué, vous verrez quelque chose comme ceci. C'est la correction du comportement, ce qui vous permet de reprendre le contrôle complet sur l'étirement comportement de la
TreeViewItem
en-tête:Avis au début/FIN de la partie avec les lignes en pointillés dans le code XAML de la source. En gros, j'ai juste mis en
Grid.ColumnSpan=2
sur la délinquanceBorder
, de sorte qu'il va remplir le tendu de la largeur de laGrid
. Cet élément est émise par laTreeViewItem
modèle, j'ai trouvé un moyen efficace de modifier ses propriétés, c'est via un ciblageStyle
dans le dictionnaire de ressources de laTreeViewItem
'sStyle
. Oui, c'était déroutant. QueStyle
est accessible viaTreeViewItem.ItemContainerStyle
.Pour voir les comportement défectueux, vous pouvez mettre en commentaire la partie entre les lignes pointillées:
Vous pouvez également définir ces styles dans certains dictionnaire de ressources, plutôt que d'utiliser le
ItemContainerStyle
bien comme je l'ai fait ici. J'ai fait de cette façon parce qu'il minimise la portée de la correction, de sorte que sans rapport avecBorder
contrôles ne seront pas touchés. Si vous avez besoin d'un plus discriminatoire de cibler juste ce contrôle, vous pourriez être en mesure de prendre avantage du fait qu'il aName='Bd'
.[edit:] Cette solution ne pas utiliser la réflexion! Ne soyez pas effrayés par le sens des données de démonstration--il n'a rien à voir avec ce problème; c'est juste la façon la plus simple de récupérer des données hiérarchiques pour les besoins de la démonstration, tout en gardant l'ensemble du programme de minuscules.
[edit #2:] je viens de réaliser que ce que les concepteurs ont essayé d'éviter avec 3x2 agencement de grille est la suivante disgracieux effet (exagéré ici par un zoom-out capture d'écran). Donc, si vous adoptez l'une des solutions à partir de cette page, soyez prévenus que vous ne pourriez pas vouloir cela:
Si vous voulez dire quelque chose comme cette capture d'écran
(source: bendewey.com)
Mise à jour
Comme indiqué dans cet exemple, la chute de l'être en retrait sur les points
(source: bendewey.com)
Alors cela devrait vous aider. Il est aussi basé sur http://msdn.microsoft.com/en-us/library/ms788727.aspx vous pouvez modifier la TreeViewItem du Modèle à un StackPanel et définir la ItemsPanel Marge de gauche à 19. Puis, dans l'Arborescence, vous définissez la HorizontalContentAlignment="Stretch". Je suis à la fixation de la totalité de la ressource ci-dessous, mais ici, c'est la partie importante.
Contrôle
Ressources
C'est de loin la solution la plus simple. Il suffit de créer un rectangle, l'appeler Hb, et de définir sa margine à 100px et n'est pas visible. Seulement lui Visibles lorsque vous avez sélectionné ou le dessus de la souris. C'est un hack, mais vous êtes bon pour jusqu'à 5 niveaux imbriqués TreeViewItems (100 > 19*5)
Si vous voulez dire quelque chose comme cette capture d'écran
(source: bendewey.com)
Alors cela devrait vous aider. Il est basé sur http://msdn.microsoft.com/en-us/library/ms788727.aspx vous pouvez apporter quelques modifications à la TreeViewItem de la Grille de mise en page. Fondamentalement, vous retirez la troisième colonne. Puis, dans l'Arborescence, vous définissez la HorizontalContentAlignment="Stretch". Je suis à la fixation de la totalité de la ressource ci-dessous, mais ici, c'est la partie importante.
Contrôle
Ressources
Source de problème lors de l'utilisation TreeView avec ItemsSource est référencé texte du lien, j'ai modifié le code de TreeViewItemExtensions classe:
Utilisé quelque chose comme theseven7 pour faciliter l'utilisation de bendewey du code basé sur un modèle avec TreeViewItems...
Pour XAML seule approche que j'ai pris une de Bendewey des solutions et cassé un peu en plus une solution de base:
Le style ci-dessous devrait permettre de Treeview éléments de durée:
Afin de l'obtenir pour fonctionner et s'effondrer comme une véritable Arborescence ci-dessous les déclencheurs doivent permettre cela:
Juste imbriquer les déclencheurs dans le Modèle de Contrôle. Couleurs/padding/design devra être modifié pour l'adapter à vos propres besoins, mais le dessus doit être une idée de base sur une XAML seule fondation.
J'ai réussi en copiant le ItemContainerStyle out à l'aide de mélange, de donner un nom à la grille que l'élément est placé dans puis définir l'arrière-plan de la grille.