2010-11-28 75 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