C# 通过鼠标单击选择TreeViewItems将调用所有父项

C# 通过鼠标单击选择TreeViewItems将调用所有父项,c#,wpf,treeview,mouseevent,C#,Wpf,Treeview,Mouseevent,我有一个简单的TreeView类,在WPF应用程序中有几个TreeViewItem(我自己设计的)。我希望被点击的项目被选中,这基本上是非常简单的。但是,每当用户单击一个不是根元素的元素时,就会为其所有父节点调用mouserightbutnup事件,从而也会选择all父节点。这是我的代码: public class MyTreeViewItem : TreeViewItem { public MyTreeViewItem() { this.MouseRightBu

我有一个简单的
TreeView
类,在WPF应用程序中有几个
TreeViewItem
(我自己设计的)。我希望被点击的项目被选中,这基本上是非常简单的。但是,每当用户单击一个不是根元素的元素时,就会为其所有父节点调用
mouserightbutnup
事件,从而也会选择all父节点。这是我的代码:

public class MyTreeViewItem : TreeViewItem
{
    public MyTreeViewItem()
    {
        this.MouseRightButtonDown += MyTreeViewItem_MouseRightButtonDown ;
    }

    void MyTreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {
        if (sender as MyTreeViewItem != null)
            (sender as MyTreeViewItem).IsSelected = true;
    }
}

在调试器中,我发现确实为每个父级分别调用了
mytreevieItem\u MouseRightButtonDown
方法。如何避免这种情况?

WPF中的路由事件有一个属性,可以将它们标记为已处理

标记已处理的事件将限制已路由事件对事件路由沿线的侦听器的可见性。该事件仍然会在路由的其余部分传递,但只有在AddHandler(RouteEvent、Delegate、Boolean)方法调用中专门添加了HandleEventsTo true的处理程序才会被调用作为响应

您可以设置
e.Handled=true在您的代码中,它将不会继续这样触发事件:

public class MyTreeViewItem : TreeViewItem
{
    public MyTreeViewItem()
    {
        this.MouseRightButtonDown += MyTreeViewItem_MouseRightButtonDown ;
    }

    void MyTreeViewItem_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
    {

        if (sender as MyTreeViewItem != null)
        {
            (sender as MyTreeViewItem).IsSelected = true;
            e.Handled = true;
        }
    }
}

事情有时候很简单。。。