Шаблоны, визуальное и логическое дерево

Последнее обновление: 20.02.2016

Наряду со стилями Universal Windows Platform предоставляет еще оно средство для кастомизации элементов управления - шаблоны (control template). Но чтобы понять, что представляют шаблоны, вначале необходимо ознакомиться с такими понятиями как логическое дерево и визуальное дерево.

Логическое и визуальное деревья являются своего рода каркасом графического интерфейса приложения. Мы можем представить приложение как некий набор вложенных элементов. Возьмем, к примеру, следующую простейшую разметку xaml:

<Page
    x:Class="TemplateApp.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TemplateApp"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <Button x:Name="someButton">Click Me</Button>
    </Grid>
</Page>

Здесь структуру визуальных элементов можно описать следующим образом:

Логическое дерево в Universal Windows Platform

Так, в элементе Page есть вложенный элемент Grid, в Gride - элемент Button, в кнопке в качестве содержимого установлен некоторый текст в виде объекта String. И все это находится во фрейме, который устанавливается в качестве содержимого в объекте Window. В итоге получается некое дерево элементов, которое является логическим. Логическое дерево образует модель доступа к дочерним элементам.

От него отличается визуальное дерево, которое для той же разметки XAML будет выглядеть следующим образом:

Визуальное дерево в Universal Windows Platform

Визуальное дерево сложнее по своей структуре, оно показывает, как с визуальной точки зрения устроен элемент, из каких частей он состоит.

Visual Studio имеет встроенные средства для просмотра визуального дерева элементов. Для этого нам надо запустить проект в режиме отладки и в меню выбрать Debug -> Windows -> Live Visual Tree. После выбора этого пункта Visual Studio откроет окно со схемой визуального дерева, на котором мы можем увидеть, как устроен элемент:

Визуальное дерево в UWP

Визуальное дерево элемента управления определяет шаблон элемента - своего рода визуальный скелет элемента управления. Например, для элемента Button упрощенно шаблон выглядит следующим образом:

<ControlTemplate TargetType="Button">
    <Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
        <ContentPresenter x:Name="ContentPresenter"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                Content="{TemplateBinding Content}"
                ContentTransitions="{TemplateBinding ContentTransitions}"
                ContentTemplate="{TemplateBinding ContentTemplate}"
                Padding="{TemplateBinding Padding}"
                HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                AutomationProperties.AccessibilityView="Raw"/>
    </Grid>
</ControlTemplate>

Полностью встроенный шаблон и стиль кнопки можно найти по ссылке https://msdn.microsoft.com/en-us/library/windows/apps/mt299109.aspx

И здесь мы можем увидеть, что сам шаблон задается с помощью элемента ControlTemplate. Атрибут TargetType="Button" как раз определяет, что данный шаблон применяется к элементу Button. А в самом элементе можно увидеть вложенность элемента ContentPresenter в Grid, которые и определяют визуальное дерево элемента Button.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850