如何在TreeviewItem中获取子控件?

时间:2014-11-09 12:01:04

标签: wpf visualtreehelper

我认为我的TreeViewItem是一个StackPanel,里面有imagetextblock;我希望获得对TextBlock内部的引用。以下代码node的类型为TreeviewItem,我相信childrenCound =3可能是StackPanel image textblock!但它内部找不到任何TextBlock。我从未看到任何控制台输出,object _itemToMove返回null

TreeViewItem node = UIHelper.FindVisualParent<TreeViewItem>(e.OriginalSource as FrameworkElement);
var child = VisualTreeHelper.GetChild(node, 0);
int childrenCount = VisualTreeHelper.GetChildrenCount(child);
for (int i = 0; i < childrenCount; i++)
{
    TextBlock vc = VisualTreeHelper.GetChild(child, i) as TextBlock;
    if (vc != null)
    {
        Console.WriteLine("ggggggggggggggggggggggggggggggggggggggggggggggg");

        _itemToMove = vc.Text as object;
    }

}
Console.WriteLine(childrenCount+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;");

2 个答案:

答案 0 :(得分:1)

可能是你的TextBlock埋藏得比你想象的要深。我总是使用以下帮助程序获得成功,该帮助程序非常通用,可以在应用程序的其他地方使用。

public static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
    if (obj != null)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
        {
            var child = VisualTreeHelper.GetChild(obj, i);
            if (child is T)
            {
               return (T)child;
            }

            T childItem = FindVisualChild<T>(child);
            if (childItem != null) return childItem;
        }
    }
    return null;
}

我想我是从StackOverflow的类似问题中得到的。

答案 1 :(得分:-1)

正如 Michael T 所说,TreeViewItem 也是 TreeViewItem 的子项。我遇到了这个老问题,因为我只想要单个 TreeViewItem 的 visualtree 元素,而我多次使用 FindVisualChild 函数这次没有用。 所以我修改了这个函数来检索 TreeVieItem 的元素,不包括里面的 TreeViewItems。该函数基于这样一个事实,即任何层次结构都是由节点定义的,并假设一个节点的 NodeType 不是子节点的类型。但是,您可以根据需要深入树中的任意多个级别(HierachyLevels 参数)。 该函数还搜索元素的特定类型和名称。

 Public Sub FindChildGroup(Of T As DependencyObject, H As DependencyObject)(Parent As DependencyObject _
     , ChildName As String _
     , ByRef OutputList As List(Of T) _
     , Optional HierachyLevels As Integer = 0)

  Dim childrenCount As Integer = VisualTreeHelper.GetChildrenCount(Parent)

  For i As Integer = 0 To childrenCount - 1

     'Analyze child
     Dim child = VisualTreeHelper.GetChild(Parent, i)

     'Is node?
     Dim IsNode = TypeOf child Is H

     If IsNode And HierachyLevels > 0 Or TypeOf child IsNot H Then

        Dim child_Test As T = TryCast(child, T)

        If child_Test IsNot Nothing Then

           'should be included in the list?
           Dim child_Element As FrameworkElement = TryCast(child_Test, FrameworkElement)

           If child_Element.Name Like ChildName Then
              OutputList.Add(child_Test)
           End If

        End If

        'Go down next level
        If TypeOf child Is H Then HierachyLevels -= 1
        FindChildGroup(Of T, H)(child, ChildName, OutputList, HierachyLevels)
        If TypeOf child Is H Then HierachyLevels += 1

     End If
  Next

结束子