Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }