• 获取父级、同级、子级控件的类型、命名(转)


     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 1140. Stone Game II
    主席树
    Codeforces Round #442 (Div. 2) E Danil and a Part-time Job (dfs序加上一个线段树区间修改查询)
    UVALive 3942 Remember the Word
    UVA 11235 Frequent values (RMQ )
    CodeForces
    hdu 2955 Robberies (01背包好题)
    hdu 1054 Strategic Game (简单树形DP)
    hdu 5532 Almost Sorted Array (水题)
    hdu 2089 不要62 (数位dp基础题)
  • 原文地址:https://www.cnblogs.com/5696-an/p/7583223.html
Copyright © 2020-2023  润新知