代码之家  ›  专栏  ›  技术社区  ›  tcables

WPF双击TreeView子节点

  •  10
  • tcables  · 技术社区  · 15 年前

    我在TreeView中有一个这样的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>
    

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

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

    3 回复  |  直到 9 年前
        1
  •  24
  •   Aurelien Ribon    15 年前
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" />
            ...
    
        2
  •  13
  •   Robin Davies    12 年前
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <EventSetter Event="MouseDoubleClick" Handler="OnItemMouseDoubleClick" />
            ...
    

    然后,必须按如下方式编写处理程序,以防止双击触发连续的父TreeView项:

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

    多亏了金色核糖体90%的成功率。双击问题在堆栈交换的其他日志中似乎是众所周知的。只需将两个解决方案合并为一个答案。

        3
  •  3
  •   ezolotko    9 年前

    这是我唯一能让它适用于所有情况的方法:

        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;
        }
    
    推荐文章