none
TreeViewItem的双击事件,会多次触发调用上级,直到最顶层,如何解决 RRS feed

  • 问题

  • TreeViewItem的双击事件,会多次触发调用上级,直到最顶层。查阅了资料,似乎无法阻止向上级节点遍历,那怎么编写条件判断代码使第二次以后的事件触发,走向不调用业务代码的分支方向?

    如果要实体类设计上做到,那TreeViewItem绑定的实体类要怎么设计。

              private void TreeViewItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)
           {
               
                TreeViewItem treeviewItem = sender as TreeViewItem;
               TreeNode tree= treeviewItem.DataContext as TreeNode;
               
               //下列代码在双击子节点时,避免在上级节点的事件触发中被运行?编写怎样的条件语句以及实体类要如何改变才能实现?
                MessageBox.Show(tree.toString());
            }
    
    
    public class TreeNode
    {
                private ObservableCollection<TreeNode> _childNodes;
    
            public ObservableCollection<TreeNode> childNode
            {
                get { return _childNodeList; }
                set { _childNodeList = value;
                    this.OnChanged();
                }
            }
    
    
    }





    2019年10月31日 9:32

全部回复

  • 能给出类似代码?

    • 已建议为答案 Snoring Cat 2019年11月3日 13:40
    • 取消建议作为答案 Snoring Cat 2019年11月3日 13:40
    2019年10月31日 11:11
  • 能给出类似代码?

    主题追加内容了,为了简化问题,实体类内容有点多,为了回答,缩减了很多,只保留TreeView绑定的基本树结构的实体。
    2019年11月3日 7:11
  • 真的是好问题啊。

    我原本以为使用AddHandler方法会阻止传播。

    treeviewItem.AddHandler(TreeViewItem.MouseDoubleClickEvent, (MouseButtonEventHandler)TreeViewItem_MouseDoubleClick, true);


    但是,并没有效果。

    说明,这个方法是同时引发?(猜测)这个看样子需要高手来回答了,我得查查资料了,看看源代码了。

    不过,我使用了其他方法来阻止事件的重复。

    原理是:

    因为是双击事件,也就是同时引发了Select事件,TreeViewItem的IsSelected为True.通过触发器设置某个属性为特殊值,然后在CS页面的双击事件方法内判断是否此值即可。

    xaml代码

    <Grid>
            <TreeView>
                <TreeView.Resources>
                    <Style TargetType="TreeViewItem">
                        <Style.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter Property="BorderThickness" Value="1"/>
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TreeView.Resources>
                <TreeViewItem Header="AAAAA" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
                    <TreeViewItem Header="bbbbb" MouseDoubleClick="TreeViewItem_MouseDoubleClick">
                        <TreeViewItem  Header="ccc" MouseDoubleClick="TreeViewItem_MouseDoubleClick"/>
                    </TreeViewItem>
                </TreeViewItem>
            </TreeView>
        </Grid>

    CS代码:

      TreeViewItem treeviewItem = sender as TreeViewItem;
                if (treeviewItem.BorderThickness == new Thickness(1))
                {
                    MessageBox.Show(treeviewItem.Header.ToString());
                    treeviewItem.IsSelected = false;
                    //其他代码毫无作用
                    // e.Handled = true;
                    //treeviewItem.AddHandler(TreeViewItem.MouseDoubleClickEvent, (MouseButtonEventHandler)TreeViewItem_MouseDoubleClick, true);
                }

    截图


    • 已编辑 ARM830 2019年11月3日 11:29
    2019年11月3日 11:28