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.