WPF双击TreeviewItem子节点

WPF双击TreeviewItem子节点,wpf,treeview,double-click,treeviewitem,Wpf,Treeview,Double Click,Treeviewitem,我在树状视图中有一个树状视图项,该树状视图将绑定一个列表: <TreeViewItem Name="tviOffline" Foreground="Red" FontWeight="Bold" Header="Offline"> <TreeViewItem.ItemTemplate> <DataTemplate DataType="{x:Type lo

我在树状视图中有一个树状视图项,该树状视图将绑定一个列表:

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

我不知道如何让每个孩子都有一个双击事件

感谢您的帮助。非常感谢。


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

感谢Aurelian Ribon在这方面取得了90%的成功。在Stack Exchange上的其他帖子中,双击问题似乎是众所周知的。只是将两种解决方案合并为一个答案

这是我让它在所有情况下都能工作的唯一方法:

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

更简单的是,我没有使用
TryGetClickedItem
,而是使用了
hit.GetVisualParent()。这比预期的要容易得多。谢谢-现在我知道,如果您的事件设置为ItemContainerStyle,那么实际上不需要在可视化树中进行向上搜索来查找TreeItem。
   private void OnItemMouseDoubleClick(object sender, MouseButtonEventArgs args)
    {
        if (sender is TreeViewItem)
        {
            if (!((TreeViewItem)sender).IsSelected)
            {
                return;
            }
        }

        .... do stuff.

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