Язык программирования C#9 и платформа .NET5
На заметку! Элементы управления WPF часто описывают как лишенные внешности. Это относится к тому факту, что внешний вид элемента управления WPF совершенно не зависит от его поведения и допускает настройку.
Программное инспектирование логического дерева
Хотя анализ логического дерева окна во время выполнения — не слишком распространенное действие при программировании с применением WPF, полезно упомянуть о том, что в пространстве имен
определен классSystem.Windows, который позволяет инспектировать структуру логического дерева во время выполнения. Для иллюстрации связи между логическими деревьями, визуальными деревьями и шаблонами элементов управления создайте новый проект приложения WPF по имениLogicalTreeHelper.TreesAndTemplatesAppЗамените элемент
приведенной ниже разметкой, которая содержит два элемента управленияGridи крупный допускающий только чтение элементButtonс включенными линейками прокрутки. Создайте в IDE-среде обработчики событийTextBoxдля каждой кнопки. Вот результирующая разметка XAML:Click<DockPanel LastChildFill="True"><Border Height="50" DockPanel.Dock="Top" BorderBrush="Blue"><StackPanel Orientation="Horizontal"><Button x:Name="btnShowLogicalTree" Content="Logical Tree of Window"Margin="4" BorderBrush="Blue" Height="40"Click="btnShowLogicalTree_Click"/><Button x:Name="btnShowVisualTree" Content="Visual Tree of Window"BorderBrush="Blue" Height="40" Click="btnShowVisualTree_Click"/></StackPanel></Border><TextBox x:Name="txtDisplayArea" Margin="10"Background="AliceBlue" IsReadOnly="True"BorderBrush="Red" VerticalScrollBarVisibility="Auto"HorizontalScrollBarVisibility="Auto" /></DockPanel>Внутри файла кода C# определите переменную-член
типа_dataToShow. В обработчике событияstringобъектаClickвызовите вспомогательную функцию,которая продолжит вызывать себя рекурсивно с целью заполнения строковой переменной логическим деревомbtnShowLogicalTree. Для этого будет вызван статический методWindowобъектаGetChildren(). Ниже показан необходимый код:LogicalTreeHelperprivate 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), которая выполняет похожую рекурсивную логику с целью построения текстового представления визуального дерева:btnShowVisualTreeusing System.Windows.Media;private void btnShowVisualTree_Click(object sender, RoutedEventArgs e){_dataToShow="";BuildVisualTree(0, this);txtDisplayArea.Text=_dataToShow;}void BuildVisualTree(int depth, DependencyObject obj)
