Язык программирования 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 для выяснения, каким образом визуализировать элемент
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, расположенного в сборке
PresentationFramework.dll
Control
private Control _ctrlToExamine=null;
Ниже показан остальной код, который требует импортирования пространств имен
System.Reflection.System.Xml
System.Windows.Markup
private void btnTemplate_Click(
object sender, RoutedEventArgs e)
{
_dataToShow="";
ShowTemplate();
txtDisplayArea.Text=_dataToShow;