Ejemplo n.º 1
0
        /// <summary>
        /// 在指定子类型(T2)的情况下,从当前层级开始逐层向下查找特定类型的对象(T1)
        /// </summary>
        public static List <T1> GetChildrenOrSelf <T1, T2>(DependencyObject objReference) where T1 : FrameworkElement where T2 : FrameworkElement
        {
            List <T1> listRetval = new List <T1>();

            do
            {
                if (null == objReference)
                {
                    break;
                }

                if (objReference is T2)
                {
                    break;
                }

                if (objReference is T1)
                {
                    listRetval.Add((T1)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 T1)
                    {
                        listRetval.Add((T1)objChild);
                        continue;
                    }

                    List <T1> listGrandChilds = VisualTreeHelperEx.GetChildrenOrSelf <T1, T2>(objChild);
                    if (null != listGrandChilds && listGrandChilds.Count > 0)
                    {
                        listRetval.AddRange(listGrandChilds);
                    }
                }
            }while (false);

            return(listRetval);
        }