// Если элемент - не DependencyObject, тогда пропустить его.
if (!(obj is DependencyObject))
return;
// Выполнить рекурсивный вызов для каждого логического дочернего элемента.
foreach (var child in LogicalTreeHelper.GetChildren((DependencyObject)obj))
{
BuildLogicalTree(depth + 5, child);
}
}
private void btnShowVisualTree_Click(
object sender, RoutedEventArgs e)
{
}
После запуска приложения и щелчка на кнопке Logical Tree of Window (Логическое дерево окна) в текстовой области отобразится древовидное представление, которое выглядит почти как точная копия исходной разметки XAML (рис. 27.10).
< image l:href="#"/>
Программное инспектирование визуального дерева
Визуальное дерево объекта
Window
также можно инспектировать во время выполнения с использованием класса
VisualTreeHelper
из пространства имен
System.Windows.Media
. Далее приведена реализация обработчика события
Click
для второго элемента управления
Button
(
btnShowVisualTree
), которая выполняет похожую рекурсивную логику с целью построения текстового представления визуального дерева:
На рис. 27.11 видно, что визуальное дерево открывает доступ к нескольким низкоуровневым агентам визуализации, таким как
ContentPresenter
,
AdornerDecorator
,
TextBoxLineDrawingVisual
и т.д.
Программное инспектирование стандартного шаблона элемента управления
Вспомните, что визуальное дерево применяется инфраструктурой WPF для выяснения, каким образом визуализировать элемент
Window
и все содержащиеся в нем элементы. Каждый элемент управления WPF хранит собственный набор команд визуализации внутри своего стандартного шаблона. С точки зрения программирования любой шаблон может быть представлен как экземпляр класса
ControlTemplate
. Кроме того, стандартный шаблон элемента управления можно получить через свойство
Template
:
// Получить стандартный шаблон элемента Button.
Button myBtn=new Button;
ControlTemplate template=myBtn.Template;
Подобным же образом можно создать в коде новый объект
ControlTemplate
и подключить его к свойству
Template
элемента управления:
// Подключить новый шаблон для использования в кнопке.
// Предположим, что этот метод добавляет весь код для звездообразного шаблона.
MakeStarTemplate(customTemplate);
myBtn.Template=customTemplate;
Наряду с тем, что новый шаблон можно строить в коде, намного чаще это делается в разметке XAML. Тем не менее, прежде чем приступить к построению собственных шаблонов, завершите текущий пример и добавьте возможность просмотра стандартного шаблона для элемента управления WPF во время выполнения, что может оказаться полезным способом ознакомления с общей структурой шаблона Добавьте в разметку окна новую панель
StackPanel
с элементами управления; она стыкована с левой стороной главной панели