Главная » C#, Windows Runtime, XAML, Разработка для Windows 8 » Расширение разметки XAML

0

Существует ряд сценариев, которые не позволяют указать в качестве свойства одного из  атрибутов непосредственное значение.  Например,  если значение одного  свойства  в  одном  элементе  зависит  от  текущего  значения  другого свойства во втором  элементе,  то для записи значения атрибутов используют расширения  разметки. Расширения разметки позволяют установить значение атрибута нестандартным образом; чаще всего такая необходимость  возникает при установке значения свойств динамически.

В XAML существует четыре расширения разметки:

·                   Binding — позволяет сделать привязку свойства к любому динамическому объекту,   например   объекту   заданного   класса.   Расширение   очень эффективно при привязке данных к элементу;

·                   StaticResources — позволяет указать ссылку на ресурсы;

·                   TemplateBinding — используется аналогично Binding, но  при  работе с шаблонами элементов;

·                   RelativeSource —  используется для  связывания атрибутов с  данными самого объекта.

Рассмотрим два примера, использующих расширения разметки.

Пример 1

<Page.Resources>

<Style x:Name="btnStyle" TargetType="Button">

<Setter Property="Background" Value="Green"></Setter>

</Style>

</Page.Resources>

<Grid x:Name="LayoutRoot" Background="White">

<Button Name="myButton" Width="100" Height="50" Style="{StaticResource btnStyle}" Content="Hello">

</Button>

</Grid>

В первом примере расширение разметки использовалось для установки стиля,

описанного в ресурсах.

Пример 2

<StackPanel x:Name="LayoutRoot" >

<Slider Name="sld1" Width="300" Height="50" Minimum="100" Maximum="200"

Value="10">

</Slider>

<TextBox Text="Hello" Width=

"{Binding Value, ElementName=sld1, Mode=TwoWay}">

</TextBox>

</StackPanel>

Данный пример демонстрирует привязку  свойства Width  элемента  TextBox

к значению ползунка.

Большее количество примеров расширения разметки будет встречаться далее. Так, расширение Binding будет интенсивно использоваться в главе о связывании элементов и данных.

Зависимые свойства

Рассмотрим пример размещения кнопки внутри элемента-контейнера Canvas:

<Canvas>

<Button Content="Hello" Canvas.Top="60" Canvas.Left="120" Width="110" Height="40" Name="button1" />

</Canvas>

При внимательном рассмотрении этого кода  можно выделить два  атрибута, которые отличаются от общепринятых, — Canvas.Top, Canvas.Left. Эти атрибуты устанавливают  положение  кнопки   относительно  родительского  контейнера. В  свою  очередь,  в  XAML   существует  множество  контейнеров,  каждый  из которых  может   снабжать  различным  набором  свойств  дочерние  объекты (отступы  от границ и между элементами, строка и столбец для размещения элемента и т.д.). Очевидно, что все эти свойства определить в классе  Button невозможно.  Хранить  значения  свойств  в  классе  контейнера  для  каждого элемента также неправильно, ведь контейнер не может следить за жизненным циклом элемента и управлять списком значений. Поэтому в иерархию классов Windows Runtime был введен специальный класс DependencyObject. Этот класс является прямым наследником Object и неявно наследуется всеми объектами, имеющими   визуальное   представление.   Задача   класса   DependencyObject состоит в обеспечении поддержки любого количества зависимых свойств. Имея два метода SetValue и GetValue, этот класс позволяет любому объекту хранить динамический список свойств, ассоциирующихся с родительским контейнером. Таким  образом, используя запись Canvas.Top="60", мы фактически  вызываем следующий метод:

button1.SetValue(Canvas.TopProperty, 60)

В свою очередь, элемент Canvas, размещая объекты, запрашивает их зависимые свойства с помощью метода GetValue и выбирает необходимые значения.

Сергей Лутай, Сергей Байдачный, Windows 8 для C# разработчиков

По теме:

  • Комментарии