WPF的可视树与逻辑树
来源:互联网 发布:青海省水电数据 编辑:程序博客网 时间:2024/05/16 09:00
XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性。在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树。逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性、事件、资源等)都有与逻辑树相关联的行为。例如,属性值有时会沿着树自动传递给子元素,而触发的事件可以自底向上或自顶向下遍历树。
与逻辑树类似的一个概念是可视树。可视树基本上是逻辑树的扩展,在可视树中,节点都被打散,分放到核心可视组件中。可视树提供了一些详细的可视化实现,而不是把每个元素当作一个“黑盒”。例如,虽然ListBox从逻辑上讲是一个单独的控件,但它的默认可视呈现是由更多的原始WPF 元素组成的:一个Border对象、两个ScrollBar及其他一些元素。并非所有的逻辑树节点都会出现在可视树中,只有从System.Windows.Media.Visual或System.Windows.Media.Visual3D派生的元素才会被包含进去。其他元素(和一些简单的字符串内容,如代码清单3-1中的内容)不会包含在内,因为它们自己并没有与生俱来的呈现行为。
逻辑树是静态的,不会受到程序员的干扰(例如动态添加/删除元素),但只要用户切换不同的Windows主题,可视树就会改变。
使用System.Windows.LogicalTreeHelper和System.Windows.Media.VisualTreeHelper这两个有些对称的类可以方便地遍历逻辑树和可视树,下边提供两个方法以此遍历wpf中的可视树与逻辑树:
private void PrintVisualTree(int depth, DependencyObject obj){ Console.WriteLine(depth + " " + obj); for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) PrintVisualTree(depth + 1, VisualTreeHelper.GetChild(obj, i));}
private void PrintLogicTree(int depth, object obj){ Console.WriteLine(depth + " " + obj); if (!(obj is DependencyObject)) return; foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject)) PrintLogicTree(depth + 1, child);}
虽然在Window的构造函数中就可以遍历逻辑树,但可视树直到Window完成至少一次布局之后才会有节点,否则是空的。所以遍历可视树需要在控件渲染完再进行遍历,可以在OnContentRendered中进行调用:
protected override void OnContentRendered(EventArgs e){ base.OnContentRendered(e); PrintVisualTree(0, this);}
- WPF的可视树与逻辑树
- WPF中的逻辑树与可视树
- WPF中的逻辑树与可视树
- WPF学习系列017: 3.1 逻辑树与可视树
- 逻辑树与可视树[转]
- WPF遍历视觉树与逻辑树
- WPF的逻辑树和视觉树
- WPF的逻辑树和视觉树
- WPF的逻辑树和视觉树
- [笔记/简译]WPF的新特性——逻辑树与视觉树(下)
- WPF:逻辑树和视觉树
- WPF 逻辑树和可视化树
- 关于WPF逻辑树深入探讨
- 在WPF中减少逻辑与UI元素的耦合
- 在WPF中减少逻辑与UI元素的耦合
- [笔记/简译]WPF的新特性——逻辑树和视觉树(上)
- WPF的逻辑树和视觉树——出自《IT168》
- WPF 视觉树和逻辑树区别,以及其子节点的遍历过程。
- 宽带的带宽
- VB.net 调用自己封装起来的用VB.net做的DLL
- 蒋川最佳棋手 孙勇征最大突破
- J SE基础笔记3
- Rails宝典之第一式: 实例变量做查询缓存
- WPF的可视树与逻辑树
- J SE基础笔记4
- C语音___复习一下
- ant的模块化以及java调用
- 细说cache
- C++复习(继承,运算符)
- 封送处理您的数据:利用 COM 和 Windows 2000 的高效传输数据的技术
- oracle 技巧 sql 优化
- SSH1整合下的通用泛型DAO+分页,基于HibernateTemplate