【WPF】查找父/子控件(元素、节点)

摘要:
整理项目中常见的控件查找函数,包括查找父控件/子控件以及查找相同类型的所有子控件(=null){if{returnparent;}//如果在上一级的父控件中找不到具有指定名称的控件,请转到下一级查找parent=VisualTreeHelper GetParent;}returnnull;}//////查找子控件//////子控件的类型//找到obj的子控件//要查找的子控件的name属性//目标子控件的publicstaticTGetChildObject其中T:FrameworkElement{DependencyObjectchild=null;GrandChild=null;for{child=VisualTreeHelper.GetChild;如果{returnchild;}否则{//如果在下一级未找到具有指定名称的子控件,请转到下一级查找grandChild=GetChildObject<T>;If(grandChild!

整理一下项目中常用的找控件功能,包括找父/子控件、找到所有同类型子控件(比如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项目时可以拿来参考)

免责声明:文章转载自《【WPF】查找父/子控件(元素、节点)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于lua闭包导致引用无法释放内存泄露修改linux终端命令行颜色下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【WPF】软件更新程序的设计思路

目标:客户端程序在启动时,自动联网检查服务端是否有新的版本,有则提示用户更新客户端。 思路: 1、打开Visual Studio,在主体程序的解决方案下再新建一个叫自动更新程序的项目。主体程序的目录是D:workspaceMyProjectClient,自动更新程序的目录是D:workspaceMyProjectUpdateTool。 2、最后打包出来时将...

WPF 2D绘图(2)Geometry

Shape是对Geometry的一种封装,Shape本质上还是通过绘制Geometry的形状,然后以填充笔刷来呈现效果 如Rectangle <Path Stroke="Black" StrokeThickness="1" Fill="#CCCCFF"> <Path.Data>...

WPF概述

Windows Presentation Foundation (简称WPF),是一个可创建适用于Windows的桌面客户端应用程序的UI框架。WPF框架支持广泛的应用程序开发功能,包括应用程序模型、空间、图形和数据绑定。WPF使用Extension Application Markup Language(XAML)为应用程序编程提供声明性模型。 WPF有...

WPF下的语法高亮控件——AvalonEdit

早就听闻SharpDevelop 会采用WPF作为界面,今天在网上闲逛的时候发现了其语法编辑器——AvalonEdit已经发布了,在CodeProject上也可以看到其代码了。 界面效果如下: 下载了其Demo简单的试用了一下:支持语法高亮、智能提示、代码折叠、撤销&重做,另外,还支持不少快捷键;可以说是该有的功能基本上都有了。 性能上也十分...

WPF调用图片路径,或资源图片

一、加载本项目的图片WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源。其中较为常见的情况是用Uri加载图像。Uri表达式的一般形式为:协议+授权+路径协议:pack://授权:有两种。一种用于访问编译时已经知道的文件,用application:///一种用于访问编译时不知道、运行时才知道的文件,用si...

【转】编写高质量代码改善C#程序的157个建议——建议87:区分WPF和WinForm的线程模型

建议87:区分WPF和WinForm的线程模型WPF和WinForm窗体应用程序都有一个要求,那就是UI元素(如Button、TextBox等)必须由创建它的那个线程进行更新。WinForm在这方面的限制并不是很严格,所以像下面这样的代码,在WinForm中大部分情况下还能运行(本建议后面会详细解释为什么会出现这种现象): private void but...