На заметку!
Элементы управления WPF часто описывают как лишенные внешности. Это относится к тому факту, что внешний вид элемента управления WPF совершенно не зависит от его поведения и допускает настройку.Программное инспектирование логического дерева
Хотя анализ логического дерева окна во время выполнения — не слишком распространенное действие при программировании с применением WPF, полезно упомянуть о том, что в пространстве имен System.Windows
LogicalTreeHelper, который позволяет инспектировать структуру логического дерева во время выполнения. Для иллюстрации связи между логическими деревьями, визуальными деревьями и шаблонами элементов управления создайте новый проект приложения WPF по имени TreesAndTemplatesApp.Замените элемент Grid
Button и крупный допускающий только чтение элемент TextBox с включенными линейками прокрутки. Создайте в IDE-среде обработчики событий Click для каждой кнопки. Вот результирующая разметка XAML:
Margin="4" BorderBrush="Blue" Height="40"
Click="btnShowLogicalTree_Click"/>
BorderBrush="Blue" Height="40" Click="btnShowVisualTree_Click"/>
Background="AliceBlue" IsReadOnly="True"
BorderBrush="Red" VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility
="Auto" />Внутри файла кода 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.