/// <summary> /// 深层递归遍历,查找特定类型、特定名称的子对象 /// </summary> public static T GetChildObject <T>(DependencyObject objReference, string strName) where T : FrameworkElement { T objRetval = null; do { if (null == objReference) { break; } if (String.IsNullOrEmpty(strName)) { objRetval = VisualTreeHelperEx.GetChildObject <T>(objReference); break; } int iChildrenCount = VisualTreeHelper.GetChildrenCount(objReference); if (0 >= iChildrenCount) { break; } for (int i = 0; i < iChildrenCount; ++i) { DependencyObject objChild = VisualTreeHelper.GetChild(objReference, i); if (objChild is T && ((T)objChild).Name == strName) { objRetval = (T)objChild; break; } T objGrandChild = VisualTreeHelperEx.GetChildObject <T>(objChild, strName); if (null != objGrandChild) { objRetval = objGrandChild; break; } } }while (false); return(objRetval); }
/// <summary> /// 深层递归遍历,查找特定类型、特定名称的子对象集合 /// </summary> public static List <T> GetChildObjects <T>(DependencyObject objReference, string strName) where T : FrameworkElement { List <T> listChilds = new List <T>(); do { if (null == objReference) { break; } if (String.IsNullOrEmpty(strName)) { listChilds = VisualTreeHelperEx.GetChildObjects <T>(objReference); break; } int iChildrenCount = VisualTreeHelper.GetChildrenCount(objReference); if (0 >= iChildrenCount) { break; } for (int i = 0; i < iChildrenCount; ++i) { DependencyObject objChild = VisualTreeHelper.GetChild(objReference, i); if (objChild is T && ((T)objChild).Name == strName) { listChilds.Add((T)objChild); } List <T> listGrandChilds = VisualTreeHelperEx.GetChildObjects <T>(objChild, strName); if (null != listGrandChilds && listGrandChilds.Count > 0) { listChilds.AddRange(listGrandChilds); } } }while (false); return(listChilds); }
/// <summary> /// 在指定根类型的情况下,从当前层级开始逐层往上查找特定类型、指定名称的对象 /// </summary> public static T1 GetAncestorOrSelf <T1, T2>(DependencyObject objReference, string strName) where T1 : FrameworkElement where T2 : FrameworkElement { T1 objRetval = null; do { if (null == objReference) { break; } if (objReference is T2) { break; } if (String.IsNullOrEmpty(strName)) { objRetval = VisualTreeHelperEx.GetAncestorOrSelf <T1, T2>(objReference); break; } if (objReference is T1 && ((T1)objReference).Name == strName) { objRetval = objReference as T1; break; } if (objReference is FrameworkContentElement) { objRetval = VisualTreeHelperEx.GetAncestorOrSelf <T1, T2>((objReference as FrameworkContentElement).Parent, strName); break; } var objParent = VisualTreeHelper.GetParent(objReference); objRetval = VisualTreeHelperEx.GetAncestorOrSelf <T1, T2>(objParent, strName); }while (false); return(objRetval); }
/// <summary> /// 深层递归遍历,查找特定类型的子对象 /// </summary> public static T GetChildObject <T>(DependencyObject objReference) where T : DependencyObject { T objRetval = null; do { if (null == objReference) { break; } int iChildrenCount = VisualTreeHelper.GetChildrenCount(objReference); if (0 >= iChildrenCount) { break; } for (int i = 0; i < iChildrenCount; ++i) { DependencyObject objChild = VisualTreeHelper.GetChild(objReference, i); if (null != objChild && objChild is T) { objRetval = (T)objChild; break; } T objGrandChild = VisualTreeHelperEx.GetChildObject <T>(objChild); if (null != objGrandChild) { objRetval = objGrandChild; break; } } }while (false); return(objRetval); }