Внутри файла кода C# определите переменную-член _dataToShow
типа string
. В обработчике события Click
объекта btnShowLogicalTree
вызовите вспомогательную функцию,которая продолжит вызывать себя рекурсивно с целью заполнения строковой переменной логическим деревом Window
. Для этого будет вызван статический метод GetChildren
объекта LogicalTreeHelper
. Ниже показан необходимый код:
private string _dataToShow=string.Empty;
private void btnShowLogicalTree_Click(object sender, RoutedEventArgs e)
{
_dataToShow="";
BuildLogicalTree(0, this);
txtDisplayArea.Text=_dataToShow;
}
void BuildLogicalTree(int depth, object obj)
{
// Добавить имя типа к переменной-члену _dataToShow.
_dataToShow +=new string(' ', depth) + obj.GetType.Name + "\n";
// Если элемент - не 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).
Программное инспектирование визуального дерева
Визуальное дерево объекта Window
также можно инспектировать во время выполнения с использованием класса VisualTreeHelper
из пространства имен System.Windows.Media
. Далее приведена реализация обработчика события Click
для второго элемента управления Button
(btnShowVisualTree
), которая выполняет похожую рекурсивную логику с целью построения текстового представления визуального дерева:
using System.Windows.Media;
private void btnShowVisualTree_Click(object sender, RoutedEventArgs e)
{
_dataToShow="";
BuildVisualTree(0, this);
txtDisplayArea.Text=_dataToShow;
}
void BuildVisualTree(int depth, DependencyObject obj)
{
// Добавить имя типа к переменной-члену _dataToShow.
_dataToShow +=new string(' ', depth) + obj.GetType.Name + "\n";
// Выполнить рекурсивный вызов для каждого визуального дочернего элемента.
for (int i=0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
{
BuildVisualTree(depth + 1, VisualTreeHelper.GetChild(obj, i));
}
}
На рис. 27.11 видно, что визуальное дерево открывает доступ к нескольким низкоуровневым агентам визуализации, таким как ContentPresenter
, AdornerDecorator
, TextBoxLineDrawingVisual
и т.д.
Программное инспектирование стандартного шаблона элемента управления
Вспомните, что визуальное дерево применяется инфраструктурой WPF для выяснения, каким образом визуализировать элемент Window
и все содержащиеся в нем элементы. Каждый элемент управления WPF хранит собственный набор команд визуализации внутри своего стандартного шаблона. С точки зрения программирования любой шаблон может быть представлен как экземпляр класса ControlTemplate
. Кроме того, стандартный шаблон элемента управления можно получить через свойство Template
:
// Получить стандартный шаблон элемента Button.
Button myBtn=new Button;
ControlTemplate template=myBtn.Template;
Подобным же образом можно создать в коде новый объект ControlTemplate
и подключить его к свойству Template
элемента управления:
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT