2010-11-28 8 views
9

J'ai un élément de TreeView en tant que telle dans un TreeView qui aura une liste liée à elle:WPF Double Cliquez TreeViewItem Noeud enfant

 <TreeViewItem Name="tviOffline" Foreground="Red" FontWeight="Bold" 
         Header="Offline"> 
      <TreeViewItem.ItemTemplate> 
       <DataTemplate DataType="{x:Type local:Buddy}"> 
        <StackPanel> 
         <TextBlock Text="{Binding Nick}" FontSize="10" Foreground="#8CFFD528" /> 
        </StackPanel> 
       </DataTemplate> 
      </TreeViewItem.ItemTemplate> 
     </TreeViewItem> 

Je ne peux pas comprendre comment obtenir chacun de ses Childs d'avoir un double cliquez sur l'événement.

toute aide est appréciée. Merci beaucoup.

Répondre

22
<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" /> 
     ... 
+0

Huh. C'était beaucoup plus facile que prévu. – Dan

11
<TreeView.ItemContainerStyle> 
    <Style TargetType="{x:Type TreeViewItem}"> 
     <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" /> 
     ... 

Et puis, le gestionnaire doit être écrit comme suit afin d'éviter le double-clic de tirer sur TreeViewItems mères successives:

private void OnItemMouseDoubleClick(object sender, MouseButtonEventArgs args) 
    { 
     if (sender is TreeViewItem) 
     { 
      if (!((TreeViewItem)sender).IsSelected) 
      { 
       return; 
      } 
     } 

     .... do stuff. 

    } 

Merci à Aurelien Ribon pour obtenir 90 % du chemin. Le problème de double-clic semble être bien connu dans d'autres publications sur Stack Exchange. Juste consolider les deux solutions en une seule réponse.

+0

Merci - maintenant je sais qu'il n'y a pas besoin de faire de recherche ascendante dans l'arbre visuel pour chercher un TreeItem, si votre événement est défini sur ItemContainerStyle. –

3

Ceci est la seule façon que je réussi à le faire fonctionner pour tous les cas:

void MyTreeView_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     var clickedItem = TryGetClickedItem(myTreeView, e); 
     if (clickedItem == null) 
      return; 

     e.Handled = true; // to cancel expanded/collapsed toggle 
     DoStuff(clickedItem); 
    } 

    TreeViewItem TryGetClickedItem(TreeView treeView, MouseButtonEventArgs e) 
    { 
     var hit = e.OriginalSource as DependencyObject; 
     while (hit != null && !(hit is TreeViewItem)) 
      hit = VisualTreeHelper.GetParent(hit); 

     return hit as TreeViewItem; 
    } 
+0

Plus simple encore, au lieu de votre 'TryGetClickedItem', je viens d'utiliser' hit.GetVisualParent () '. –

Questions connexes