2010-11-28 17 views
9

をクリックしてください:WPFダブル、私はそれにバインドされたリストを持っていますツリービューでそのようにTreeView項目を持っているツリービューアイテム子ノード

 <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

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

、その後は、ハンドラが書かれなければならダブルクリックして連続した親TreeViewItemsに発射から:90を取得するためオーレリアンRibonに

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

     .... do stuff. 

    } 

感謝をそこの道の%。ダブルクリックの問題は、Stack Exchangeの他の投稿ではよく知られているようです。両方のソリューションを1つの答えに統合するだけです。

+0

ありがとうございました - あなたのイベントがItemContainerStyleに設定されている場合、視覚ツリーで上向きの検索を行い、TreeItemを探す必要は実際にはありません。 –

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

簡単ですが、あなたの 'TryGetClickedItem'の代わりに' hit.GetVisualParent () 'を使用しました。 –

関連する問題