Чтение онлайн

на главную - закладки

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Замените элемент

Grid
приведенной ниже разметкой, которая содержит два элемента управления
Button
и крупный допускающий только чтение элемент
TextBox
с включенными линейками прокрутки. Создайте в IDE-среде обработчики событий
Click
для каждой кнопки. Вот результирующая разметка XAML:

<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
объекта
LogicalTreeHelper
. Ниже показан необходимый код:

private 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).

< image l:href="#"/>

Программное инспектирование визуального дерева

Визуальное дерево объекта

Window
также можно инспектировать во время выполнения с использованием класса
VisualTreeHelper
из пространства имен
System.Windows.Media
. Далее приведена реализация обработчика события
Click
для второго элемента управления
Button
(
btnShowVisualTree
), которая выполняет похожую рекурсивную логику с целью построения текстового представления визуального дерева:

using System.Windows.Media;

private void btnShowVisualTree_Click(object sender, RoutedEventArgs e)

{

_dataToShow="";

BuildVisualTree(0, this);

txtDisplayArea.Text=_dataToShow;

}

void BuildVisualTree(int depth, DependencyObject obj)

{

// Добавить имя типа к переменной-члену _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
:

Поделиться:
Популярные книги

Отмороженный 8.0

Гарцевич Евгений Александрович
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Отмороженный 8.0

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Ермак. Телохранитель

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Сборник коротких эротических рассказов

Коллектив авторов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Сборник коротких эротических рассказов

Идеальный мир для Лекаря 19

Сапфир Олег
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 19

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Свет Черной Звезды

Звездная Елена
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Свет Черной Звезды

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Попаданка в академии драконов 4

Свадьбина Любовь
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Попаданка в академии драконов 4

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад