WPF VisualTreeHelper分析

1、方法一

public static int GetChildrenCount(
	DependencyObject reference
)可以看到接受任何为DependencyObject,wpf中的几乎所有的控件都继承自这个控件。可以看到msdn上给的例子:
 1 // Enumerate all the descendants of the visual object.
 2 static public void EnumVisual(Visual myVisual)
 3 {
 4     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
 5     {
 6         // Retrieve child visual at specified index value.
 7         Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);
 8
 9         // Do processing of the child visual object.
10
11         // Enumerate children of the child visual object.
12         EnumVisual(childVisual);
13     }
14 }

下面是一封装的一个通用的方法

 1 /// <summary>
 2 /// 利用visualtreehelper寻找对象的子级对象
 3 /// </summary>
 4 /// <typeparam name="T"></typeparam>
 5 /// <param name="obj"></param>
 6 /// <returns></returns>
 7 List<T> FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
 8 {
 9     try
10     {
11         List<T> TList = new List<T> { };
12         for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
13         {
14             DependencyObject child = VisualTreeHelper.GetChild(obj, i);
15             if (child != null && child is T)
16             {
17                 TList.Add((T)child);
18             }
19             else
20             {
21                 List<T> childOfChildren = FindVisualChild<T>(child);
22                 if (childOfChildren != null)
23                 {
24                     TList.AddRange(childOfChildren);
25                 }
26             }
27         }
28         return TList;
29     }
30     catch (Exception ee)
31     {
32         MessageBox.Show(ee.Message);
33         return null;
34     }
35 }

二、

public static DependencyObject GetParent(
	DependencyObject reference
)可能看msdn上的例子:
 1 /// <summary>
 2 /// 利用VisualTreeHelper寻找指定依赖对象的父级对象
 3 /// </summary>
 4 /// <typeparam name="T"></typeparam>
 5 /// <param name="obj"></param>
 6 /// <returns></returns>
 7 public static List<T> FindVisualParent<T>(DependencyObject obj) where T : DependencyObject
 8 {
 9     try
10     {
11         List<T> TList = new List<T> { };
12         DependencyObject parent = VisualTreeHelper.GetParent(obj);
13         if (parent != null && parent is T)
14         {
15             TList.Add((T)parent);
16             List<T> parentOfParent = FindVisualParent<T>(parent);
17             if (parentOfParent !=null)
18             {
19                 TList.AddRange(parentOfParent);
20             }
21         }
22         else
23         {
24
25         }
26         return TList;
27     }
28     catch (Exception ee)
29     {
30         MessageBox.Show(ee.Message);
31         return null;
32     }
33 }

给出一个使用的例子:

 1 private void btn_Two_Click(object sender, RoutedEventArgs e)
 2 {
 3     string parentName = "";
 4     List<Grid> gridList = FindVisualParent<Grid>(btn_Two);
 5     foreach (Grid item in gridList)
 6     {
 7         parentName += string.IsNullOrEmpty(parentName) ? item.Name.ToString() : "," + item.Name.ToString();
 8     }
 9     MessageBox.Show(string.Format(btn_Two.Name.ToString() + "共有{0}个逻辑父级,名称分别为{1}", gridList.Count, parentName));
10 }
时间: 2024-08-03 18:15:25

WPF VisualTreeHelper分析的相关文章

WPF性能提升的十个技巧

[IT168 专稿]WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势. 程序性能改善不是一蹴而就的,好的设计可以消除影响性能的问题,例如,在运行时构造对象就会对程序的性能造成影响.虽然WPF通过增强的导航等功能提供了更丰富的用户界面,但你应该考虑你的用户是否的确需要富图形界面,尽管WPF有这样那样的问题,但在UI设计,特

WPF程序性能

WPF程序性能由很多因素造成,以下是简单地总结: 元素: 1.  减少需要显示的元素数量:去除不需要或者冗余的XAML元素代码. 通过移出不必要的元素,合并layout panels,简化templates来减少可视化树的层次.这可以保证第内存使用,而改变渲染性能. 2.  UI虚拟化:只显示当前需要显示的元素. 3.  不要把不要显示的自定义控件隐藏在主界面中:虽然它们不会显示出来,但是程序启动时还是会去计算自定义控件所需的空间和位置. 4.  VirtualizingStackPanel:对

细数改善WPF应用程序性能的10大方法

WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势. 程序性能改善不是一蹴而就的,好的设计可以消除影响性能的问题,例如,在运行时构造对象就会对程序的性能造成影响.虽然WPF通过增强的导航等功能提供了更丰富的用户界面,但你应该考虑你的用户是否的确需要富图形界面,尽管WPF有这样那样的问题,但在UI设计,特别是自定义风格和控件

工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧

原文:工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)!> 看到很多朋友回复和支持,非常感谢,尤其是一些拍砖的喷油,感谢你们的批评,受益良多. 我第一份工作便是WPF的开发,一直到现在都非常喜欢这门技术,从懵懵懂懂到现在有一些WPF开发资历,也算是经历了一段坎坷的过程.我的朋友看到我写了VS2013的全攻略,他就推荐我写一个WPF篇,我想了下,的确很多朋友初接触WPF的时候难免会

改善WPF应用程序性能的10大方法 (转发)

WPF(Windows Presentation Foundation)应用程序在没有图形加速设备的机器上运行速度很慢是个公开的秘密,给用户的感觉是它太吃资源了,WPF程序的性能和硬件确实有很大的关系,越高档的机器性能越有优势. 程序性能改善不是一蹴而就的,好的设计可以消除影响性能的问题,例如,在运行时构造对象就会对程序的性能造成影响.虽然WPF通过增强的导航等功能提供了更丰富的用户界面,但你应该考虑你的用户是否的确需要富图形界面,尽管WPF有这样那样的问题,但在UI设计,特别是自定义风格和控件

WPF简介

摘要:WPF简介 WPF的全称是Windows Presentation Foundation,是微软新发布的Vista操作系统的三大核心开发库之一,其主要负责的是图形显示,所以叫Presentation(呈现). 作 为新的图形引擎,WPF是基于DirectX的,当然新增了很多新的功能.其2D和3D引擎的强大看看Vista的接口就明白了,再加上其对Aero图形 引擎的支持,更加让你感到神奇.顺便提一下,Aero是专门为3D桌面开发的引擎,可以让桌面实现神奇的3D翻转,这绝对是操作系统有史以来的

深入浅出WPF-笔记&lt;2015.02.10&gt;

默认WPF模板分析: Properties:主要是程序要用到的一些资源和配置信息: References:标记当前该项目需要引用哪些其他的项目: App.xaml:程序的主体.WIndows系统中,一个程序就是一个进程(Process).Windowg还规定:一个GUI进程需要有一个窗体作为"主窗体".App.xaml文件的作用就是声明程序的进程和主窗体: Window1.xaml:程序的主窗体,其后台代码是Window1.xaml.cs. XAML由XML派生而来,使用标签声明一个元

2019-11-29-WPF-高速书写-StylusPlugIn-原理

原文:2019-11-29-WPF-高速书写-StylusPlugIn-原理 title author date CreateTime categories WPF 高速书写 StylusPlugIn 原理 lindexi 2019-11-29 10:20:39 +0800 2018-09-20 15:51:45 +0800 WPF 源代码分析 笔迹 本文告诉大家 WPF 的 StylusPlugIn 为什么能做高性能书写,在我的上一篇博客和大家介绍了 WPF 的触摸原理,但是没有详细告诉大家如

wpf框架模型分析

一.MVVM模式介绍: 在网上看过很多的MVVM中各块的介绍,感觉很混乱.找到如下的描述感觉很合理,也很好理解(https://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx). 二.模式分析 在项目中使用这个模型,感觉有2点需要理解透,不然项目运行中肯定得乱套. 如上图描述的模块的角色和职责. 上面描述的很清楚了,但是几点地方总结下: 1)有些地方将Model看成是只有数据的对象,但是这里显然不是. 2)View 的Ui L