J'ai un bogue très étrange dans un TreeView profond à trois niveaux. Il est intermittent et je ne peux pas trouver comment le reproduire de manière cohérente. Après avoir supprimé par programme, en ajoutant puis en supprimant certains éléments de troisième niveau, lorsque je clique sur l'élément racine, il n'est pas sélectionné. Il peut encore se développer/se réduire mais ne peut pas être sélectionné avec un clic de souris et il ne déclenche pas l'événement ItemSelectionChange. Vous pouvez cliquer pour sélectionner un deuxième niveau ou des éléments de troisième niveau et après que vous êtes finalement en mesure de sélectionner l'élément racine. J'ai essayé de définir IsSelected = false pour tous les éléments après la suppression et j'ai essayé de faire un bon nettoyage lors de la suppression des éléments, mais cela n'aide pas. Est-ce que quelqu'un a rencontré ce bug? Avez-vous des suggestions pour supprimer ce bug?WPF, bug TreeView, ne peut pas sélectionner l'élément racine après que l'élément a été retiré de l'arborescence
Répondre
M'arrive après avoir programmé l'IsSelected à un nœud. Ensuite, je ne peux pas cliquer pour sélectionner le noeud précédent.
[Modifier]
finalement compris ce qui se passait. Il semble que ce n'est pas suffisant pour définir la propriété IsSelected, car le focus logique interne de l'arborescence reste sur l'ancien élément sélectionné. L'événement a été envoyé à l'élément de l'arborescence, mais comme il avait déjà un focus logique interne, il n'a pas déclenché le changement de focus (à partir duquel je soupçonne que l'arbre sait quand changer l'élément sélectionné).
Si j'appelle le focus sur le noeud d'arbre pour lequel j'ai défini IsSelected sur true, cela fonctionne correctement.
====================
avez-vous mis sur IsSelected vrai pour les nouveaux éléments ajoutés? Si oui, aussi un foyer, comme ceci:
DependencyObject nodeVisualContainer = mTreeControl.ItemContainerGenerator.ContainerFromItem(nodeToSelect);
if (nodeVisualContainer is UIElement)
((UIElement)nodeVisualContainer).Focus();
Note: Ceci ne fait que l'accent logique sur l'élément. L'accent sur le clavier ne sera pas affecté.