wpf treeviewitem

wpf treeviewitem,wpf,treeview,selected,treeviewitem,Wpf,Treeview,Selected,Treeviewitem,我正在创建一个TreeView,使用下面的方法在xml文档中循环 但是,当选择任何TreeViewItem时,层次结构中的所有节点都将获得事件触发器,而不仅仅是所选的TreeViewItem 例如,假设我们选择一个节点的孙子节点。所有节点(包括孙子节点、子节点、父节点)都触发同一事件 换句话说,我们希望只有孙子触发关联的事件,而事件应该只被调用一次,但是对于所选项目层次结构的所有节点,它最终被调用了3次 代码如下: TreeViewItem getTreeViewItemWithHeader(X

我正在创建一个
TreeView
,使用下面的方法在xml文档中循环

但是,当选择任何
TreeViewItem
时,层次结构中的所有节点都将获得事件触发器,而不仅仅是所选的
TreeViewItem

例如,假设我们选择一个节点的孙子节点。所有节点(包括孙子节点、子节点、父节点)都触发同一事件

换句话说,我们希望只有孙子触发关联的事件,而事件应该只被调用一次,但是对于所选项目层次结构的所有节点,它最终被调用了3次

代码如下:

TreeViewItem getTreeViewItemWithHeader(XmlNode node)
{
    TreeViewItem tvi = new TreeViewItem();
    tvi.Header = node.Name;//hdr;
    tvi.Tag = node.Attributes["Tag"].Value;
    tvi.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(tvi_PreviewMouseLeftButtonDown);
    tvi.Selected += new RoutedEventHandler(tvi_Selected);

    return tvi;

}
如果你有任何建议,请告诉我,谢谢


N

这工作正常。
PreviewMouseLeftButtonDown
事件是一个路由事件(在本例中,策略是隧道)。这意味着可视化树的根首先获取事件,然后向下运行,直到到达最初触发事件的控件。
MouseLeftButtonDown
Selected
事件也会被路由,但它的策略是冒泡的-这意味着事件从触发事件的控件开始沿着视觉树向上运行

如果不希望继续发送路由事件,请将传入的
RoutedEventArgs
Handled
属性设置为
true