zoukankan      html  css  js  c++  java
  • 获取父级、同级、子级控件的类型、命名(转)

     1 using System.Windows.Media;
     2 
     3  /// <summary>
     4         /// 获取父级控件
     5         /// </summary>
     6         /// <typeparam name="T">类型 调用前需要预先指定</typeparam>
     7         /// <param name="obj">当前控件对象</param>
     8         /// <param name="name">要查找的父级控件的Name(Name为“ ”时,表示上一次父控件)</param>       
     9         public static T GetParentObject<T>(DependencyObject obj, string name=null) where T : FrameworkElement
    10         {
    11 
    12             DependencyObject parent = VisualTreeHelper.GetParent(obj);
    13 
    14             //int i = 0;
    15 
    16             while (parent != null)
    17             {
    18 
    19                 if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
    20                 {
    21 
    22                     return (T)parent;
    23 
    24                 }
    25 
    26                 parent = VisualTreeHelper.GetParent(parent);
    27 
    28             }
    29 
    30             return null;
    31 
    32         }                 
    获取父级控件
     1 /// <summary>
     2         /// 通过委托来查找父级控件
     3         /// </summary>
     4         /// <typeparam name="T">事先指定的类型</typeparam>
     5         /// <param name="obj">基准对象</param>
     6         /// <param name="func">委托</param>
     7         /// <returns></returns>
     8         public static T GetParentObjectByDelegate<T>(DependencyObject obj, Func<T, bool> func) where T : FrameworkElement
     9         {
    10             DependencyObject parent = VisualTreeHelper.GetParent(obj);
    11             while (parent != null)
    12             {
    13                 if (parent is T && func(parent as T))//
    14                 {
    15 
    16                     return (T)parent;
    17 
    18                 }
    19                 parent = VisualTreeHelper.GetParent(parent);
    20 
    21             }
    22             return null;
    23 
    24         }
    通过委托来查找父级控件
     1  /// <summary>
     2         /// 获取当前控件的某个子级控件
     3         /// </summary>
     4         /// <typeparam name="T">事先指定的类型</typeparam>
     5         /// <param name="root">当前父级控件的Name</param>
     6         /// <returns></returns>      
     7         public static T FindChildOfType<T>(DependencyObject root, string name = null) where T : FrameworkElement
     8         {
     9 
    10             var queue = new Queue<DependencyObject>();
    11 
    12             queue.Enqueue(root);
    13 
    14 
    15             while (queue.Count > 0)
    16             {
    17 
    18                 DependencyObject current = queue.Dequeue();
    19 
    20                 for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
    21                 {
    22 
    23                     var child = VisualTreeHelper.GetChild(current, i);
    24 
    25                    // var typedChild = child as T;
    26 
    27                     //if (typedChild != null)
    28                     //{
    29 
    30                     //    return typedChild;
    31 
    32                     //}
    33                     if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
    34                     {
    35 
    36                         return (T)child;
    37 
    38                     }
    39 
    40                     queue.Enqueue(child);
    41 
    42                 }
    43 
    44             }
    45 
    46             return null;
    47 
    48         }
    获取当前控件的某个子级控件
     1  /// <summary>
     2         /// 通过模糊名字来 获取当前控件的某个子级控件
     3         /// </summary>
     4         /// <typeparam name="T">事先指定的类型</typeparam>
     5         /// <param name="root">当前父级控件的Name</param>
     6         /// <returns></returns>      
     7         public static T FindChildOfTypeBySomeName<T>(DependencyObject root, string name =null) where T : FrameworkElement
     8         {
     9 
    10             var queue = new Queue<DependencyObject>();
    11 
    12             queue.Enqueue(root);
    13 
    14 
    15             while (queue.Count > 0)
    16             {
    17 
    18                 DependencyObject current = queue.Dequeue();
    19 
    20                 for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
    21                 {
    22 
    23                     var child = VisualTreeHelper.GetChild(current, i);
    24 
    25                     // var typedChild = child as T;
    26 
    27                     //if (typedChild != null)
    28                     //{
    29 
    30                     //    return typedChild;
    31 
    32                     //}
    33                     if (child is T && (((T)child).Name.Contains(name) | string.IsNullOrEmpty(name)))
    34                     {
    35 
    36                         return (T)child;
    37 
    38                     }
    39 
    40                     queue.Enqueue(child);
    41 
    42                 }
    43 
    44             }
    45 
    46             return null;
    47 
    48         }
    通过模糊名字来 获取当前控件的某个子级控件
     1 /// <summary>
     2         /// 获取当前控件的某类子级控件的集合
     3         /// </summary>
     4         /// <typeparam name="T">事先指定的类型</typeparam>
     5         /// <param name="root">当前父级控件的Name</param>
     6         /// <returns></returns>      
     7         public static List<T> FindListChildOfType<T>(DependencyObject root, string name = null) where T : FrameworkElement
     8         {
     9             List<T> result=new List<T>();
    10             var queue = new Queue<DependencyObject>();
    11 
    12             queue.Enqueue(root);
    13 
    14             while (queue.Count > 0)
    15             {
    16 
    17                 DependencyObject current = queue.Dequeue();
    18 
    19                 for (int i = VisualTreeHelper.GetChildrenCount(current) - 1; 0 <= i; i--)
    20                 {
    21 
    22                     var child = VisualTreeHelper.GetChild(current, i);
    23                    
    24                     if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
    25                     {
    26 
    27                         result.Add((T)child);  //注意,这个List中的顺序并不是XAML中的结构顺序,而是其逆序哦!                   
    28                     }
    29 
    30                     queue.Enqueue(child);
    31 
    32                 }
    33 
    34             }
    35 
    36             return result;            
    37 
    38         }
    39        
    获取当前控件的某类子级控件的集合
     1         //获取同级对象控件.  问题1:父级控件类型是什么?;2.同级的控件类型又是什么?
     2         public static T FindEquativeOfType<T>(DependencyObject obj, string name = null) where T : FrameworkElement
     3         {
     4 
     5             DependencyObject parentObj = GetParentObject<T>(obj);
     6 
     7             return (T)FindChildOfType<T>(parentObj, name);
     8 
     9 
    10             //return null;
    11 
    12         }
    13 
    14      
    获取同级对象控件
  • 相关阅读:
    为图片指定区域添加链接
    数值取值范围问题
    【leetcode】柱状图中最大的矩形(第二遍)
    【leetcode 33】搜索旋转排序数组(第二遍)
    【Educational Codeforces Round 81 (Rated for Div. 2) C】Obtain The String
    【Educational Codeforces Round 81 (Rated for Div. 2) B】Infinite Prefixes
    【Educational Codeforces Round 81 (Rated for Div. 2) A】Display The Number
    【Codeforces 716B】Complete the Word
    一个简陋的留言板
    HTML,CSS,JavaScript,AJAX,JSP,Servlet,JDBC,Structs,Spring,Hibernate,Xml等概念
  • 原文地址:https://www.cnblogs.com/5696-an/p/7583223.html
Copyright © 2011-2022 走看看