Язык программирования C#9 и платформа .NET5
{// Добавить имя типа к переменной-члену _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 для выяснения, каким образом визуализировать элемент
и все содержащиеся в нем элементы. Каждый элемент управления WPF хранит собственный набор команд визуализации внутри своего стандартного шаблона. С точки зрения программирования любой шаблон может быть представлен как экземпляр классаWindow. Кроме того, стандартный шаблон элемента управления можно получить через свойствоControlTemplate:Template// Получить стандартный шаблон элемента Button.Button myBtn=new Button();ControlTemplate template=myBtn.Template;Подобным же образом можно создать в коде новый объект
и подключить его к свойствуControlTemplateэлемента управления:Template// Подключить новый шаблон для использования в кнопке.Button myBtn=new Button();ControlTemplate customTemplate=new ControlTemplate();// Предположим, что этот метод добавляет весь код для звездообразного шаблона.MakeStarTemplate(customTemplate);myBtn.Template=customTemplate;Наряду с тем, что новый шаблон можно строить в коде, намного чаще это делается в разметке XAML. Тем не менее, прежде чем приступить к построению собственных шаблонов, завершите текущий пример и добавьте возможность просмотра стандартного шаблона для элемента управления WPF во время выполнения, что может оказаться полезным способом ознакомления с общей структурой шаблона Добавьте в разметку окна новую панель
с элементами управления; она стыкована с левой стороной главной панелиStackPanel(находится прямо перед элементомDockPanel) и определена следующим образом:<TextBox><Border DockPanel.Dock="Left" Margin="10" BorderBrush="DarkGreen"BorderThickness="4"Width="358"><StackPanel><Label Content="Enter Full Name of WPF Control" Width="340"FontWeight="DemiBold" /><TextBox x:Name="txtFullName" Width="340" BorderBrush="Green"Background="BlanchedAlmond" Height="22"Text="System.Windows.Controls.Button" /><Button x:Name="btnTemplate" Content="See Template" BorderBrush="Green"Height="40" Width="100" Margin="5" Click="btnTemplate_Click"HorizontalAlignment="Left" /><Border BorderBrush="DarkGreen" BorderThickness="2" Height="260"Width="301" Margin="10" Background="LightGreen" ><StackPanel x:Name="stackTemplatePanel" /></Border></StackPanel></Border>Добавьте пустой обработчик события
:btnTemplate_Click()private void btnTemplate_Click(object sender, RoutedEventArgs e){}Текстовая область слева вверху позволяет вводить полностью заданное имя элемента управления WPF, расположенного в сборке
. После того как библиотека загружена, экземпляр элемента управления динамически создается и отображается в большом квадрате слева внизу. Наконец, в текстовой области справа будет отображаться стандартный шаблон элемента управления. Добавьте в класс C# новую переменную-член типаPresentationFramework.dll:Controlprivate Control _ctrlToExamine=null;Ниже показан остальной код, который требует импортирования пространств имен
иSystem.Reflection.System.Xml:System.Windows.Markupprivate void btnTemplate_Click(object sender, RoutedEventArgs e){_dataToShow="";ShowTemplate();txtDisplayArea.Text=_dataToShow;
