Шрифт:
Интервал:
Закладка:
{
// Добавить имя типа к переменной-члену _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 и все содержащиеся в нем элементы. Каждый элемент управления WPF хранит собственный набор команд визуализации внутри своего стандартного шаблона. С точки зрения программирования любой шаблон может быть представлен как экземпляр класса 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"
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})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. После того как библиотека загружена, экземпляр элемента управления динамически создается и отображается в большом квадрате слева внизу. Наконец, в текстовой области справа будет отображаться стандартный шаблон элемента управления. Добавьте в класс C# новую переменную-член типа 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;
- Понимание SQL - Мартин Грубер - Базы данных