J'ai un problème avec mon TreeView dans une application WPF (Framework 3.5 SP1). C'est un TreeVIew avec 2 niveaux de données. Je développe/réduit les éléments du premier niveau d'une manière particulière (avec un simple clic de souris sur le TreeViewItem). Encore une fois quand je développe un TreeViewItem de premier niveau, j'ajoute des TreeViewItems de second niveau au groupe (c'est un détail important, en fait, si je n'ajoute pas les éléments, le problème ne se produit pas). Tout fonctionne bien jusqu'à ce que le TreeView perd son focus. Si, par exemple, je développe le TreeViewItem à la première position, en ajoutant en même temps un élément au deuxième niveau, puis je clique sur un bouton (pour laisser le TreeView perdre le focus), puis je clique à nouveau sur le TreeViewItem à la troisième position pour l'agrandir, le TreeViewItem qui résulte du hit-test avec la position de la souris n'est pas le "vrai" TreeViewItem (dans ce cas le troisième), mais un TreeViewItem qui est dans une position plus élevée que celle cliqué (dans ce cas, le second). J'ai essayé d'utiliser la méthode UpdateLayout sur l'événement TreeView-LostFocus, mais sans résultats. Probablement j'ai besoin d'une méthode qui fait le contraire: à partir de l'interface utilisateur, actualisez l'objet qui contient la position de TreeViewItems. Pouvez-vous, s'il vous plaît, m'aider? Merci! PileggiWPF actualise TreeView lorsqu'il perd le focus
Voici le code:
' in this way I tried to put remedy at the problem, but it doesn't work.
Private Sub tvArt_LostFocus(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles tvArt.LostFocus
Me.tvArt.UpdateLayout()
e.Handled = True
End Sub
' here I expand/collapse the items of the first level of my TreeView
Private Sub tvArt_PreviewMouseUp(ByVal sender As System.Object, ByVal e As MouseButtonEventArgs) Handles tvArt.PreviewMouseUp
Dim p As Point = Nothing
Dim tvi As TreeViewItem = getItemFromMousePosition(Of TreeViewItem)(p, e.OriginalSource, Me.tvArt)
If tvi Is Nothing = False Then
If tvi.HasItems Then
Dim be As BindingExpression = BindingOperations.GetBindingExpression(tvi, TreeViewItem.ItemsSourceProperty)
Dim ri As P_RicambiItem = DirectCast(be.DataItem, P_RicambiItem)
If ri.isExpanded = False then
' here I add items to the second level collection
End If
ri.isExpanded = Not ri.isExpanded
End If
End If
e.Handled = True
End Sub
Private Function getItemFromMousePosition(Of childItem As DependencyObject)(ByRef p As Point, ByVal sender As UIElement, _
ByVal _item As UIElement) As childItem
p = sender.TranslatePoint(New Point(0, 0), _item)
Dim obj As DependencyObject = DirectCast(_item.InputHitTest(p), DependencyObject)
While obj Is Nothing = False AndAlso TypeOf obj Is childItem = False
obj = VisualTreeHelper.GetParent(obj)
End While
Return DirectCast(obj, childItem)
End Function