【问题标题】:How to get the root of the node given a random TreeViewItem如何在给定随机 TreeViewItem 的情况下获取节点的根
【发布时间】:2025-11-24 01:30:01
【问题描述】:

给定一个树中的随机 TreeViewItem,我如何检索节点的祖父,呃根?

我在点击子项时使用它来突出显示根。

private void TreeViewDecode_PreviewMouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
     TreeViewItem treeViewItem = GetSexyGrandDaddy(e.OriginalSource as DependencyObject);
     ...
}
private static TreeViewItem GetSexyGrandDaddy(DependencyObject source)
{
        if (source != null && source is TreeViewItem)
        {
            TreeViewItem root = VisualTreeHelper.GetParent(source) as TreeViewItem;

            while (root.Parent != null)
            {
                root = root.Parent as TreeViewItem;
            }
            return root as TreeViewItem;
        }
        return null;
}

编辑:更新的代码仍然不起作用

【问题讨论】:

  • 第一个建议:将您的方法重命名为GetSexySugarDaddy。 :>

标签: c# .net wpf treeview


【解决方案1】:

我猜你的意思是“父母”,

TreeViewItem.Parent

更新 看看这段代码:

使用

    e.Source 

而不是

    e.OrginalSource

    private void treeView1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        TreeViewItem treeViewItem = GetSexyGrandDaddy(e.Source as DependencyObject);
        if (treeViewItem != null)
        {
            //do highlight...
        }
    }

    private static TreeViewItem GetSexyGrandDaddy(DependencyObject source)
    {
        TreeViewItem sugarDad = source as TreeViewItem;
        if (sugarDad != null)
        {
            while (sugarDad.Parent as TreeViewItem != null)
                sugarDad = sugarDad.Parent as TreeViewItem;
        }
        return sugarDad;
    }

【讨论】:

  • 不是直接父级,我是指根。
  • 那么你应该递归迭代直到一个treeViewItem没有Parent
  • @I46kok 然后循环直到父级为空
  • @codeteq 哇,这太棒了。非常感谢。我能否简要解释一下为什么 OriginalSource 不起作用?
  • OrginalSource 返回/在这种情况下是用于显示 TreeViewItem 标题的 TextBlock
【解决方案2】:


你可以试试这样:

TreeViewItem root = treeViewItem;
while( root.Parent != null )
{
    root = root.Parent;
}
// now "root" contains the root of you tree...

【讨论】:

    【解决方案3】:

    您可以遍历父级,直到父级为空。那么你就有了根节点。

    TreeNode root = node.Parent;
    while(root != null)
    root = root.Parent;
    

    【讨论】:

      【解决方案4】:

      试试这个

      private static TreeViewItem GetSexyGrandDaddy(DependencyObject source)
      {
          if (source != null && source is TreeViewItem)
          {
              TreeViewItem root = source as TreeViewItem;
      
              var parent = VisualTreeHelper.GetParent(root);
              while (parent != null)
              {
                  if (parent is TreeViewItem) root = parent as TreeViewItem;
                  parent = VisualTreeHelper.GetParent(parent);
              }
      
              return root as TreeViewItem;
          }
          return null;
      } 
      

      【讨论】:

        最近更新 更多