<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
Loaded="Window_Loaded_1">
<Button Content="button" Margin="179,131,206,150"></Button>
</Grid>
</Window>
后台cs代码:
private void Window_Loaded_1(object sender, RoutedEventArgs e)
StringBuilder tree = new StringBuilder();
PrintVisualTree(this, 0, tree);
Console.WriteLine("VisualTree:");
Console.WriteLine(tree.ToString());
tree.Clear();
PrintLogicalTree(this, 0, tree);
Console.WriteLine("LogicalTree:");
Console.WriteLine(tree.ToString());
public void PrintVisualTree(DependencyObject obj, int level, StringBuilder tree)
tree.AppendLine(new string(' ', level) + obj);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
PrintVisualTree(VisualTreeHelper.GetChild(obj, i), level + 1, tree);
public void PrintLogicalTree(DependencyObject obj, int level, StringBuilder tree)
tree.AppendLine(new string(' ', level) + obj);
foreach (var v in LogicalTreeHelper.GetChildren(obj))
if (v is DependencyObject)
PrintLogicalTree(v as DependencyObject, level + 1, tree);
VisualTree:
WpfApplication1.MainWindow
System.Windows.Controls.Border
System.Windows.Documents.AdornerDecorator
System.Windows.Controls.ContentPresenter
System.Windows.Controls.Grid
System.Windows.Controls.Button: button
Microsoft.Windows.Themes.ButtonChrome
System.Windows.Controls.ContentPresenter
System.Windows.Controls.TextBlock
System.Windows.Documents.AdornerLayer
LogicalTree:
WpfApplication1.MainWindow
System.Windows.Controls.Grid
System.Windows.Controls.Button: button
从视觉树的结构中可以看到,Button的Content是显示在TextBlock上的,所以,我们可以通过查找视觉树来修改Button的Content样式。
private void buttonSunny_Click_1(object sender, RoutedEventArgs e)
ChangeVisualTree<TextBlock>(this);
public void ChangeVisualTree<T>(DependencyObject obj) where T : FrameworkElement
if (obj is T)
switch (typeof(T).Name)
case "TextBlock":
TextBlock textBlock = obj as TextBlock;
textBlock.Background = Brushes.Yellow;
textBlock.Foreground = Brushes.Brown;
break;
default:
break;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
ChangeVisualTree<T>(VisualTreeHelper.GetChild(obj, i));
WPF Inspector可以更加详细地了解WPF应用的树形结构和样式等,也可以修改样式,用法很简单,先运行WPF应用,然后打开WPF Inspector,等其加载完成之后,双击列表中的应用即可。
1.1WPF中的坐标
1.1.1 WPF的默认坐标:WPF中平面坐标系主要包括原点位置、X和Y轴方向,以及坐标单位。WPF的默认坐标系原点位置在绘制区域的左上角,X轴向右增加,Y轴向下增加。
自定义坐标系:自定义坐标系主要通过Transform类来实现,一般可以使用ScaleTransform和Translat...
在WPF(Windows Presentation Foundation)中,逻辑树(Logical Tree)和视觉树(Visual Tree)是构建和管理用户界面的两个核心概念。- 在WPF中,逻辑树和视觉树共同工作,确保用户界面既能正确表示业务逻辑,又能以合适的方式呈现给用户。- 属性值的继承和资源查找也是通过逻辑树进行的,但它们的最终表现是在视觉树中实现的。- 视觉树的渲染效果(如样式和布局更改)可以反映逻辑树中的结构。- 逻辑树中的更改(如添加或移除控件)会影响视觉树的构成。
WPF中有两中“树”:一种叫逻辑树(Logical Tree);一种叫可视化元素树(Visual Tree)。
Logical Tree 最显著的特点就是它完全由布局组件和控件构成(包括列表类控件中的条目元素),换句话说就是它的每个节点不是布局组件就是控件。那什么是 Visual Tree 呢?我们知道,如果把一片树叶放在放大镜下观察,你会发现这片叶子也像一棵树一样——有自己的基部并向上生长出多级分叉。
在WPF的Logical Tree 上,充当叶子的...
理解WPF中的视觉树和逻辑树
理解WPF中的视觉树和逻辑树 Understanding the Visual Tree and Logical Tree in WPF这篇文章讨论WPF中视觉树和逻辑树的细微差别。同时提供了一个小程序供读者稍后分析。如果你已经对着两个概念完全不熟悉,我建议你先读SDK文档中的这篇文章“URL”。
目前SDK文档中关于视觉树和逻辑树的介绍...
提供用于查询逻辑树中的对象的静态帮助器方法。
LogicalTreeHelper对于分析方案非常有用,在这种情况下,将以递归方式遍历逻辑树,并使用一致的方法检查各种父对象或子对象
Logi..
理解WPF中的视觉树和逻辑树 Understanding the Visual Tree and Logical Tree in WPF
这篇文章讨论WPF中视觉树和逻辑树的细微差别。同时提供了一个小程序供读者稍后分析。如果你已经对着两个概念完全不熟悉,
我建议你先读SDK文档中的这篇文章“URL”。
目前SDK文档中关于视觉树和逻辑树的介绍还不是很完全。从我一开始接触WP
逻辑树与视觉树属于WPF的基本概念,学过WPF或者Silverlight的朋友一定会对其有所耳闻,这篇文章将来探讨逻辑树与视觉树的特质以及两者的区别
WPF Inspector工具介绍
WPF Inspector是一个新的WPF辅助工具,我们可以通过这个工具来观察WPF程序生成的逻辑树与视觉树
观察逻辑树与视觉树
左侧为视觉树,右侧为逻辑树
1、WPF启动程序的根元素均为Application。2、逻辑树与XAML的布局结构是相同的。3、视觉树是根据控件的模板来呈现的,我们很难猜测视觉树的结
#region 获取控件
//获取当前TreeView的TreeViewItem
public TreeViewItem GetParentObjectEx<TreeViewItem>(DependencyObject obj) where TreeViewItem : FrameworkElement
DependencyObject parent = VisualTreeHelper.GetParent(obj);
TreeList
TreeList的职责是读取一棵树的根节点,然后把整棵树(下称“数据树”)转换成一个列表,通过Items属性提供给DataGrid。并且TreeList要负责跟踪数据树的节点的增删情况,实时维护Items集合,以便数据树的变化能在DataGrid上反映出来。
TreeList独立完成这项工作比较困难,原因在于:每个数据树上的节点(下称“数据节点”)显示到表格中时,表格需要知道节点的一些信息,例如
节点在树的第几层,以便计算缩进量,节点当前是展开的还是没有展开,节点在表格中是可见还是不可见.