对所有父项调用通过鼠标单击选择树视图项

本文关键字:单击 鼠标 选择 视图 调用 | 更新日期: 2023-09-27 18:34:51

我有一个简单的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方法。如何避免这种情况?

对所有父项调用通过鼠标单击选择树视图项

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