视树泛型查找,功能强大

潜移默化学会WPF(企业经验篇)--全新替代掉VisualHelper功能的类,可视树泛型查找,功能强大

/// <summary>
         /// Finds a Child of a given item in the visual tree.
         /// </summary>
         /// <param name="parent">A direct parent of the queried item.</param>
         /// <typeparam name="T">The type of the queried item.</typeparam>
         /// <param name="childName">x:Name or Name of child. </param>
         /// <returns>The first parent item that matches the submitted type parameter.
         /// If not matching item can be found,
         /// a null parent is being returned.</returns>
         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;
         }
 
         public DependencyObject FindChild(DependencyObject o, Type childType)
         {
             DependencyObject foundChild = null;
             if (o != null)
             {
                 int childrenCount = VisualTreeHelper.GetChildrenCount(o);
                 for (int i = 0; i < childrenCount; i++)
                 {
                     var child = VisualTreeHelper.GetChild(o, i);
                     if (child.GetType() != childType)
                     {
                         foundChild = FindChild(child, childType);
                     }
                     else
                     {
                         foundChild = child;
                         break;
                     }
                 }
             }
             return foundChild;
         }
 
         public static T FindVisualParent<T>(UIElement element) where T : UIElement
         {
             UIElement parent = element; while (parent != null)
             {
                 T correctlyTyped = parent as T; if (correctlyTyped != null)
                 {
                     return correctlyTyped;
                 }
                 parent = VisualTreeHelper.GetParent(parent) as UIElement;
             } return null;
         }
 
         public static T FindChild<T>(DependencyObject parent) where T : DependencyObject
         {
             if (parent == null) return null;
 
             T childElement = null; int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++)
             {
                 var child = VisualTreeHelper.GetChild(parent, i);
                 T childType = child as T; if (childType == null)
                 {
                     childElement = FindChild<T>(child); if (childElement != null) break;
                 }
                 else
                 {
                     childElement = (T)child; break;
                 }
             } return childElement;
         }

用法,你懂的

原文地址:https://www.cnblogs.com/fx2008/p/2755134.html