2010-11-28 10 views
9

ich einen treeview Artikel als solche in einer Baumansicht, die eine Liste gebunden, um es haben wird:WPF Double Click TreeViewItem Child Node

 <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> 

Ich kann nicht herausfinden, wie jeder seiner Childs bekommen eine doppelte haben Klicken Sie auf Ereignis.

jede Hilfe wird geschätzt. Vielen Dank.

Antwort

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

Huh. Das war viel einfacher als erwartet. – Dan

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

und dann hat der Handler geschrieben werden wie folgt vor, um die Doppelklick aus dem Brennen auf aufeinanderfolgenden Mutter TreeViewItems zu verhindern:

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

     .... do stuff. 

    } 

Dank Aurelien Ribon 90 für immer % des Weges dorthin. Das Doppelklick-Problem scheint in anderen Posts auf Stack Exchange bekannt zu sein. Ich konsolidiere beide Lösungen in einer Antwort.

+0

Danke - jetzt weiß ich, dass es keine Notwendigkeit gibt, aufwärts im visuellen Baum nach einem TreeItem zu suchen, wenn Ihr Event auf dem ItemContainerStyle gesetzt ist. –

3

Dies ist die einzige Art, wie ich es bekommen verwaltet für alle Fälle zu arbeiten:

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

Noch einfacher, anstelle von 'TryGetClickedItem' habe ich' hit.GetVisualParent () 'verwendet. –

Verwandte Themen