_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 (находится прямо перед элементом ) и определена следующим образом: BorderThickness="4"
Width="358">
FontWeight="DemiBold" />
Background="BlanchedAlmond" Height="22"
Text="System.Windows.Controls.Button" />
Height="40" Width="100" Margin="5" Click="btnTemplate_Click"
HorizontalAlignment="Left" />
Width="301" Margin="10" Background="LightGreen" >
Добавьте пустой обработчик события 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;
}
private void ShowTemplate()
{
// Удалить элемент, который в текущий момент находится
// в области предварительного просмотра.
if (_ctrlToExamine !=null)