zoukankan      html  css  js  c++  java
  • 【WPF】查找父/子控件(元素、节点)

    整理一下项目中常用的找控件功能,包括找父/子控件、找到所有同类型子控件(比如ListBox找到所有Item)。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Media;
    
    namespace MyDemo.Utils
    {
        /// <summary>
        /// 用于查找控件的工具类:找到父控件、子控件
        /// </summary>
        class ControlsSearchHelper
        {
            /// <summary>
            /// 查找父控件
            /// </summary>
            /// <typeparam name="T">父控件的类型</typeparam>
            /// <param name="obj">要找的是obj的父控件</param>
            /// <param name="name">想找的父控件的Name属性</param>
            /// <returns>目标父控件</returns>
            public static T GetParentObject<T>(DependencyObject obj, string name) where T : FrameworkElement
            {
                DependencyObject parent = VisualTreeHelper.GetParent(obj);
    
                while (parent != null)
                {
                    if (parent is T && (((T)parent).Name == name | string.IsNullOrEmpty(name)))
                    {
                        return (T)parent;
                    }
    
                    // 在上一级父控件中没有找到指定名字的控件,就再往上一级找
                    parent = VisualTreeHelper.GetParent(parent);
                }
    
                return null;
            }
    
    
            /// <summary>
            /// 查找子控件
            /// </summary>
            /// <typeparam name="T">子控件的类型</typeparam>
            /// <param name="obj">要找的是obj的子控件</param>
            /// <param name="name">想找的子控件的Name属性</param>
            /// <returns>目标子控件</returns>
            public static T GetChildObject<T>(DependencyObject obj, string name) where T : FrameworkElement
            {
                DependencyObject child = null;
                T grandChild = null;
    
                for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
                {
                    child = VisualTreeHelper.GetChild(obj, i);
    
                    if (child is T && (((T)child).Name == name | string.IsNullOrEmpty(name)))
                    {
                        return (T)child;
                    }
                    else
                    {
                        // 在下一级中没有找到指定名字的子控件,就再往下一级找
                        grandChild = GetChildObject<T>(child, name);
                        if (grandChild != null)
                            return grandChild;
                    }
                }
    
                return null;
    
            }
    
    
            /// <summary>
            /// 获取所有同一类型的子控件
            /// </summary>
            /// <typeparam name="T">子控件的类型</typeparam>
            /// <param name="obj">要找的是obj的子控件集合</param>
            /// <param name="name">想找的子控件的Name属性</param>
            /// <returns>子控件集合</returns>
            public static List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
            {
                DependencyObject child = null;
                List<T> childList = new List<T>();
    
                for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
                {
                    child = VisualTreeHelper.GetChild(obj, i);
    
                    if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
                    {
                        childList.Add((T)child);
                    }
    
                    childList.AddRange(GetChildObjects<T>(child, ""));
                }
    
                return childList;
    
            }
        }
    }
    
            public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
            {
                if (depObj != null)
                {
                    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                    {
                        DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
    
                        if (child != null && child is T)
                            yield return (T)child;
    
                        foreach (T childOfChild in FindVisualChildren<T>(child))
                            yield return childOfChild;
                    }
                }
            }
    • 这是用的WPF的查找方式,依赖的库很多无法跨平台,但是这种递归查找的方式值得学习和借鉴。(例如以后做Unity项目时可以拿来参考)
  • 相关阅读:
    SAP MM 启用批次管理的物料MB21创建预留单据时批次号可以为空!
    强化学习十大原则
    新手必看:生成对抗网络的初学者入门指导
    华为云总裁郑叶来:易获取、用得起、方便用的算力是人工智能发展的关键
    贝叶斯、香农、奥卡姆合写博客「机器学习是什么」
    诗人般的机器学习,ML工作原理大揭秘
    为什么AI的翻译水平还远不能和人类相比?
    2018-8-10-wpf-DoEvents-
    2018-2-13-win10-uwp-iot
    2019-9-11-.NET-Standard
  • 原文地址:https://www.cnblogs.com/sjqq/p/8495159.html
Copyright © 2011-2022 走看看