为所有父项调用鼠标单击选择树视图项

时间:2013-10-11 14:24:30

标签: c# wpf treeview mouseevent

我有一个简单的TreeView类,在WPF应用程序中有几个TreeViewItem(我自己设计)。我想要选择被点击的项目,这实际上非常简单。但是,只要用户单击不是根元素的元素,就会为其所有父元素调用MouseRightButtonUp事件,从而导致所有父节点也被选中。这是我的代码:

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

在调试器中,我发现确实为每个父项单独调用MyTreeViewItem_MouseRightButtonDown方法。我该如何避免这种情况?

1 个答案:

答案 0 :(得分:2)

WPF中的路由事件具有Handled属性,可以将其标记为已处理。

  

标记处理的事件将限制路由事件在事件路径上对侦听器的可见性。该事件仍然在路径的其余部分传播,但只有在AddHandler(RoutedEvent,Delegate,Boolean)方法调用中专门添加HandledEventsToo 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;
        }
    }
}