2010-06-07 4 views
0

J'ai un WPF TreeView avec 2 niveaux de données.
J'ai supprimé le ToogleButton du TreeViewItemTemplate. Maintenant, je voudrais développer/réduire les groupes avec un seul clic de souris (pas avec un double clic comme comportement par défaut).
J'ai essayé de cette façon:Rendre sélectionnable à nouveau un WPF TreeviewITem après le premier clic

Private Sub tvArt_SelectedItemChanged(ByVal sender As System.Object, _ 
    ByVal e As RoutedPropertyChangedEventArgs(Of System.Object)) Handles tvArt.SelectedItemChanged 

    If e.NewValue Is Nothing = False Then 
     Dim ri As P_RicambiItem = TryCast(e.NewValue, P_RicambiItem) 
     If ri Is Nothing = False Then 
      If ri.isExpanded Then 
       ri.isExpanded = False 
      Else 
       ri.isExpanded = True 
      End If 
      ri.isSelected = False 
     End If 
    End If 
End Sub 

En utilisant mes propriétés isExpanded et isSelected dans la source de données de collecte. Mais ça ne marche qu'à mi-chemin: après le premier clic, infact, je ne peux pas cliquer une seconde fois sur le même objet, car, même si je l'ai désélectionné, le gestionnaire d'événements "se souvient" qu'il était le dernier élément sélectionné et il ne capture pas l'événement SelectedItemChanged.

Comment puis-je faire?

Répondre

2

manière la plus simple est probablement de gérer l'événement PreviewMouseDown sur le TreeView et identifier quand la souris clique sur le TreeViewItems parent:

XAML:

<TreeView Name="treeView1" TreeView.PreviewMouseDown="OnTreeViewPreviewMouseDown" /> 

code-behind:

private void OnTreeViewPreviewMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    TreeViewItem tvi = GetTreeViewItemClicked((FrameworkElement) e.OriginalSource, treeView1); 
    if (null == tvi) return; 
    tvi.IsExpanded = !tvi.IsExpanded; 
} 

private static TreeViewItem GetTreeViewItemClicked(UIElement sender, UIElement treeView) 
{ 
    Point p = sender.TranslatePoint(new Point(0, 0), treeView); 
    var obj = treeView.InputHitTest(p) as DependencyObject; 
    while (obj != null && !(obj is TreeViewItem)) 
    { 
     obj = VisualTreeHelper.GetParent(obj); 
    } 
    return obj as TreeViewItem; 
} 
+0

Merci! Mais je ne peux pas trouver l'événement "Click" pour le TreeView. Dans l'événement "MouseUp" je ne peux pas voir les données car l'arbre treeview n'est toujours pas sélectionné. Pouvez-vous, s'il vous plaît, me montrer un petit extrait de code? C# est bon, je vais faire la "traduction". – lamarmora

+0

Oui, désolé. C'était un peu trompeur. J'ai mis à jour l'approche pour gérer l'événement PreviewMouseDown à la place. – hemp

+0

Merci beaucoup! Ça marche bien! – lamarmora

1

Merci beaucoup! Cela fonctionne très bien, si quelqu'un devrait être intéressé, c'est ma version Vb:

Private Sub tvArt_PreviewMouseDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs) Handles tvArt.PreviewMouseDown 
    Dim tvi As TreeViewItem = GetTreeViewItemClicked(e.OriginalSource, Me.tvArt) 
    If tvi Is Nothing = False Then 
     If tvi.HasItems Then 
      tvi.isExpanded = Not tvi.isExpanded 
     End If 
    End If 
End Sub 

Private Function GetTreeViewItemClicked(ByVal sender As UIElement, ByVal _treeView As UIElement) As TreeViewItem 
    Dim p As Point = sender.TranslatePoint(New Point(0, 0), _treeView) 
    Dim obj As DependencyObject = DirectCast(_treeView.InputHitTest(p), DependencyObject) 
    While obj Is Nothing = False AndAlso TypeOf obj Is TreeViewItem = False 
     obj = VisualTreeHelper.GetParent(obj) 
    End While 
    Return DirectCast(obj, TreeViewItem) 
End Function 
Questions connexes