Logical and Visual Trees

The existence of templates leads to an API design dilemma that the WPF architects had to resolve. If a developer wishes to access the elements in the UI, should she see the fully expanded tree, containing all the instantiated templates? Although this would put the developer in full control, it might be rather cumbersome; often a developer only really cares that there is a Button present, not about the structure of its appearance. On the other hand, to present the simple pre-expansion view would be unnecessarily limiting.

To solve this problem, WPF lets you work with either the logical tree or the visual tree. The visual tree contains most[58] of the elements originally specified (either in markup or in code) plus all the extra elements added as a result of template instantiation. The logical tree is a subset of the visual tree that omits the elements added as a result of control template instantiation. WPF provides two helper classes for working with these two trees: VisualTreeHelper and LogicalTreeHelper.

For example, consider the following snippet of XAML:

<WrapPanel Name="rootPanel">
  <Button>_Click me</Button>
</WrapPanel>

Walking this logical tree at runtime using the LogicalTreeHelper looks like Example 9-12.

Example 9-12. Dumping the logical tree

public Window1(  ) {
  InitializeComponent(  );

  // Can dump the logical tree anytime after InitComp
  DumpLogicalTree(rootPanel, 0); } void DumpLogicalTree(object parent, int level) { string typeName = parent.GetType( ...

Get Programming WPF, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.