2010-11-28 10 views
9

Tengo un artículo de árbol como tal en una vista de árbol que tendrá una lista con destino a la misma:WPF doble clic TreeViewItem Nodo filial

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

no puedo encontrar la manera de conseguir cada uno de sus niño a tener un doble haga clic en evento.

se agradece cualquier ayuda. muchas gracias.

Respuesta

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

Huh. Eso fue mucho más fácil de lo esperado. – Dan

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

y luego, el controlador tiene que ser escrito de la siguiente manera con el fin de evitar que el doble clic de disparar contra los sucesivos TreeViewItems padres:

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

     .... do stuff. 

    } 

Gracias a Aurelien Ribon para obtener 90 % del camino allí. El problema del doble clic parece ser conocido en otras publicaciones en Stack Exchange. Solo consolidando ambas soluciones en una respuesta.

+0

Gracias - ahora sé que en realidad no hay necesidad de realizar una búsqueda al alza en el árbol visual para buscar un elemento de árbol, si su evento está establecido en ItemContainerStyle. –

3

Ésta es la única manera me las arreglé para conseguir que funcione para todos los casos:

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

Más simple aún, en lugar de su 'TryGetClickedItem', acabo de utilizar' hit.GetVisualParent () '. –

Cuestiones relacionadas