2010-11-28 49 views
9

我有一个TreeView一个TreeView项这样将绑定了一个清单:WPF双双击TreeViewItem子节点

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

我无法弄清楚如何获得它的每一个孩子的的有双点击事件。

任何帮助表示赞赏。非常感谢。

回答

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

呵呵。这比预期容易得多。 – Dan 2017-07-13 14:48:24

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

然后,处理程序必须被写成为了防止如下双击从射击连续父TreeViewItems:

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

     .... do stuff. 

    } 

感谢的Aurelien瑞邦为获得90那里的百分比。双击问题在Stack Exchange的其他帖子中似乎是众所周知的。只需将两个解决方案合并为一个答案。

+0

谢谢 - 现在我知道如果您的事件设置在ItemContainerStyle上,实际上不需要在可视化树中向上搜索以查找TreeItem。 – 2018-01-30 09:32:23

3

这是我设法得到它为所有的情况下工作的唯一办法:

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

简单一些,我只是使用了`hit.GetVisualParent ()`而不是`TryGetClickedItem`。 – 2017-05-30 13:52:00