通过下面的方式可以查看WPF的控件树,分为两种:逻辑树和视觉树。其中逻辑树是视觉树的子集。
public Window1()
{
InitializeComponent();
Debug.WriteLine("逻辑树");
PrintLogicalTree(0, this);
}
protected override void OnContentRendered(EventArgs e)
{
base.OnContentRendered(e);
Debug.WriteLine("视觉树");
PrintVisualTree(0, this);
}
void PrintLogicalTree(int depth, object obj)
{
Debug.WriteLine(new string(' ', depth*2) + obj);
if (!(obj is DependencyObject)) return;
foreach (object child in LogicalTreeHelper.GetChildren(obj as DependencyObject))
PrintLogicalTree(depth + 1, child);
}
void PrintVisualTree(int depth, DependencyObject obj)
{
Debug.WriteLine(new string(' ', depth*2) + obj);
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
PrintVisualTree(depth + 1, VisualTreeHelper.GetChild(obj, i));
}
运行结果如下
逻辑树
WpfApplication1.Window1
System.Windows.Controls.Grid
System.Windows.Controls.TextBox
System.Windows.Controls.Label
System.Windows.Controls.Button: Button
Button
System.Windows.Controls.Button: Button
Button
WpfApplication1.UserControl1
System.Windows.Controls.Grid
System.Windows.Controls.TextBox: Hello,World
Hello,World
视觉树
WpfApplication1.Window1
System.Windows.Controls.Border
System.Windows.Documents.AdornerDecorator
System.Windows.Controls.ContentPresenter
System.Windows.Controls.Grid
System.Windows.Controls.TextBox
Microsoft.Windows.Themes.ListBoxChrome
System.Windows.Controls.ScrollViewer
System.Windows.Controls.Grid
System.Windows.Shapes.Rectangle
System.Windows.Controls.ScrollContentPresenter
System.Windows.Controls.TextBoxView
System.Windows.Media.DrawingVisual
System.Windows.Documents.AdornerLayer
System.Windows.Controls.Primitives.ScrollBar 最小值:0 最大值:0 值:0
System.Windows.Controls.Primitives.ScrollBar 最小值:0 最大值:0 值:0
System.Windows.Controls.Label
System.Windows.Controls.Border
System.Windows.Controls.ContentPresenter
System.Windows.Controls.TextBlock
System.Windows.Controls.Button: Button
Microsoft.Windows.Themes.ButtonChrome
System.Windows.Controls.ContentPresenter
System.Windows.Controls.TextBlock
System.Windows.Controls.Button: Button
Microsoft.Windows.Themes.ButtonChrome
System.Windows.Controls.ContentPresenter
System.Windows.Controls.TextBlock
WpfApplication1.UserControl1
System.Windows.Controls.Border
System.Windows.Controls.ContentPresenter
System.Windows.Controls.Grid
System.Windows.Controls.TextBox: Hello,World
Microsoft.Windows.Themes.ListBoxChrome
System.Windows.Controls.ScrollViewer
System.Windows.Controls.Grid
System.Windows.Shapes.Rectangle
System.Windows.Controls.ScrollContentPresenter
System.Windows.Controls.TextBoxView
System.Windows.Media.DrawingVisual
System.Windows.Documents.AdornerLayer
System.Windows.Controls.Primitives.ScrollBar 最小值:0 最大值:0 值:0
System.Windows.Controls.Primitives.ScrollBar 最小值:0 最大值:0 值:0
System.Windows.Documents.AdornerLayer