Search code examples
c#wpflistview

The Double Click Event Problem of Child Items in Treeview Control in WPF


After double clicking on the child item of the treeview control in wpf, Expanded or MouseDoubleClick will execute twice TreeViewItem_MouseDoubleClick or TreeViewItem_Expanded How to solve the problem where I execute twice when I double-click on a sub item

  `<TreeView
         x:Name="Tree_Channel"
         ItemsSource="{Binding TreeItems}">
        <TreeView.ItemContainerStyle>
         <Style TargetType="{x:Type TreeViewItem}">
         <EventSetter Event="Expanded" Handler="TreeViewItem_Expanded" />
         <EventSetter Event="PreviewMouseDoubleClick"  Handler="TreeViewItem_MouseDoubleClick"/>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Name}" />
         </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

  public Window1()
        {
     InitializeComponent();
    DataContext = this;

        TreeItems = new ObservableCollection<TreeNode>();


        var rootNode1 = new TreeNode("Root 1");
        var rootNode2 = new TreeNode("Root 2");     
        rootNode1.Children.Add(new TreeNode("Child 1"));
        rootNode1.Children.Add(new TreeNode("Child 2"));
        rootNode2.Children.Add(new TreeNode("Child 3"));
        rootNode2.Children.Add(new TreeNode("Child 4"));     
        TreeItems.Add(rootNode1);
        TreeItems.Add(rootNode2);
    }
    public ObservableCollection<TreeNode> TreeItems { get; set; }
    private void TreeViewItem_Expanded(object sender, RoutedEventArgs e)
    {

    }  
    public class TreeNode

    {
        public string Name { get; set; }
        public ObservableCollection<TreeNode> Children { get; set; }

        public TreeNode(string name)
        {
            Name = name;
            Children = new ObservableCollection<TreeNode>();
        }
    }

    private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
    {


    }
    }

Solution

  • Issue you have is that parent item also handle mouse double click. You can filter it in the handler.

    private void TreeViewItem_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
    {
        //Return, if parent item handler
        if (sender != e.OriginalSource)
        {
            TreeViewItem tvi = null;
    
            var visParent = VisualTreeHelper.GetParent(e.OriginalSource as FrameworkElement);
            while (tvi == null && visParent != null)
            {
                tvi = visParent as TreeViewItem;
                visParent = VisualTreeHelper.GetParent(visParent);
            }
            if (tvi == null || tvi != sender)                    
            {
                return; 
            }
        }
    
        e.Handled = true; // Stop expand behavior on double click
    }