1

我在 WPF 应用程序中有一个简单的TreeView类,其中包含几个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为每个父级单独调用了该方法。我该如何避免这种情况?

4

1 回答 1

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;
        }
    }
}
于 2013-10-11T14:33:30.473 回答