2012-05-23 1 views
3

Я попытался найти ответ на эту проблему и в каждом посте я считаю, что есть ответ на нахождение детей рекурсивны, но ни один из них не работают со скрытыми или разрушились детьмиНайти логический ребенок, включая скрытые и разрушился узлы

Кроме того, в в каждом посте кто-то спросил, возможно ли это, но никто не ответил, поэтому я начинаю думать, что это невозможно.

Если у кого-то есть способ сделать это, я буду вечно благодарен.

Моя функция выглядит следующим образом:

 public static DependencyObject FindLogicalDescendentByName(this DependencyObject source, string name) 
    { 
     DependencyObject result = null; 
     IEnumerable children = LogicalTreeHelper.GetChildren(source); 

     foreach (var child in children) 
     { 
      if (child is DependencyObject) 
      { 
       if (child is FrameworkElement) 
       { 
        if ((child as FrameworkElement).Name.Equals(name)) 
         result = (DependencyObject)child; 
        else 
         result = (child as DependencyObject).FindLogicalDescendentByName(name); 
       } 
       else 
       { 
        result = (child as DependencyObject).FindLogicalDescendentByName(name); 
       } 
       if (result != null) 
        return result; 
      } 
     } 
     return result; 
    } 

-EDITED Итак, я понимаю, моя проблема заключается в том, что я пытался найти элемент, прежде чем он был создан,

Я связывание с свойство в xaml, которое исчезнет и найдет элемент по заданному имени, но элемент не был создан в тот момент времени, если я повторно заказал элемент в xaml, он работает и элемент найден ... doh!

ответ

2

Вот мой код, он работает, если указать X: Имя и тип

Пример вызова:

System.Windows.Controls.Image myImage = FindChild<System.Windows.Controls.Image>(this (or parent), "ImageName"); 



/// <summary> 
/// Find specific child (name and type) from parent 
/// </summary> 
public static T FindChild<T>(DependencyObject parent, string childName) where T : DependencyObject 
{ 
    // Confirm parent and childName are valid. 
    if (parent == null) return null; 

    T foundChild = null; 

    int childrenCount = VisualTreeHelper.GetChildrenCount(parent); 
    for (int i = 0; i < childrenCount; i++) 
    { 
     var child = VisualTreeHelper.GetChild(parent, i); 
     // If the child is not of the request child type child 
     T childType = child as T; 
     if (childType == null) 
     { 
     // recursively drill down the tree 
     foundChild = FindChild<T>(child, childName); 

     // If the child is found, break so we do not overwrite the found child. 
     if (foundChild != null) break; 
     } 
     else if (!string.IsNullOrEmpty(childName)) 
     { 
     var frameworkElement = child as FrameworkElement; 
     // If the child's name is set for search 
     if (frameworkElement != null && frameworkElement.Name == childName) 
     { 
      // if the child's name is of the request name 
      foundChild = (T)child; 
      break; 
     } 
     } 
     else 
     { 
     // child element found. 
     foundChild = (T)child; 
     break; 
     } 
    } 

    return foundChild; 
    } 
+0

Это все еще, кажется, не работает, у меня есть 2 возможных гаечные 1. Мои элементы управления находятся на третьей стороне панели, которая, как представляется, не имеет каких-либо элементов визуального дерева, но имеет логические элементы дерева, следовательно, используя логическое дерево. 2. Сторонняя панель и все элементы управления внутри находятся в словаре ресурсов и используются в качестве шаблона. – Kezza

+0

Итак, я добавил небольшую панель стека вокруг двух элементов управления, которые я хотел найти, и я прошел через ваш код, и когда я доберусь до панели стека, а childCount возвращается из VisualTreeHelper, это значение равно 1, это элемент управления это видно, элемент управления, который не отображается, по-прежнему отсутствует ... они одного типа, и оба имеют атрибут x: Name – Kezza

+1

Я понял, что я делал неправильно. спасибо за ваш ответ, хотя – Kezza