Розширення розмітки XAML

Існує ряд сценаріїв, які не дозволяють вказати як властивості одного з атрибутів безпосереднє значення Наприклад, якщо значення однієї властивості в одному елементі залежить від поточного значення іншого властивості в другому елементі, то для запису значення атрибутів використовують розширення розмітки Розширення розмітки дозволяють встановити значення атрибута нестандартним чином частіше всього така необхідність виникає при встановленні значення властивостей динамічно

У XAML існує чотири розширення розмітки:

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Binding – Дозволяє зробити привязку властивості до будь-якого динамічному обєкту, наприклад обєкту заданого класу Розширення дуже ефективно при привязці даних до елементу

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp StaticResources – Дозволяє вказати посилання на ресурси

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp TemplateBinding – Використовується аналогічно Binding, Але при роботі з шаблонами елементів

·&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp RelativeSource – Використовується для звязування атрибутів з даними самого обєкта

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

Приклад 1

&ltPageResources&gt

&ltStyle x:Name=&quotbtnStyle&quot TargetType=&quotButton&quot&gt

&ltSetter Property=&quotBackground&quot Value=&quotGreen&quot&gt&lt/Setter&gt

&lt/Style&gt

&lt/PageResources&gt

&ltGrid x:Name=&quotLayoutRoot&quot Background=&quotWhite&quot&gt

&ltButton Name=&quotmyButton&quot Width=&quot100&quot Height=&quot50&quot Style=&quot{StaticResource btnStyle}&quot Content=&quotHello&quot&gt

&lt/Button&gt

&lt/Grid&gt

У першому прикладі розширення розмітки використовувалося для установки стилю,

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

Приклад 2

&ltStackPanel x:Name=&quotLayoutRoot&quot &gt

&ltSlider Name=&quotsld1&quot Width=&quot300&quot Height=&quot50&quot Minimum=&quot100&quot Maximum=&quot200&quot

Value=&quot10&quot&gt

&lt/Slider&gt

&ltTextBox Text=&quotHello&quot Width=

&quot{Binding Value, ElementName=sld1, Mode=TwoWay}&quot&gt

&lt/TextBox&gt

&lt/StackPanel&gt

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

до значення повзунка

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

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

&ltCanvas&gt

&ltButton Content=&quotHello&quot CanvasTop=&quot60&quot CanvasLeft=&quot120&quot Width=&quot110&quot Height=&quot40&quot Name=&quotbutton1&quot /&gt

&lt/Canvas&gt

При уважному розгляді цього коду можна виділити два атрибути, які відрізняються від загальноприйнятих, – CanvasTop, CanvasLeft Ці атрибути встановлюють положення кнопки щодо батьківського контейнера У свою чергу, в XAML існує безліч контейнерів, кожен з яких може постачати різним набором властивостей дочірні обєкти (відступи від меж і між елементами, рядок і стовпець для розміщення елемента і тд) Очевидно, що всі ці властивості визначити в класіButton неможливо Зберігати значення властивостей в класі контейнера для кожного елемента також неправильно, адже контейнер не може стежити за життєвим циклом елемента і керувати списком значень Тому в ієрархію класів Windows Runtime був введений спеціальний клас DependencyObject Цей клас є прямим спадкоємцем Object і неявно успадковується всіма обєктами, що мають візуальне уявлення Завдання класуDependencyObject полягає в забезпеченні підтримки будь-якої кількості залежних властивостей Маючи два методи SetValue і GetValue, Цей клас дозволяє будь-якому обєкту зберігати динамічний список властивостей, що асоціюються з батьківським контейнером Таким чином, використовуючи запис CanvasTop=&quot60&quot, Ми фактично викликаємо наступний метод:

button1SetValue(CanvasTopProperty, 60)

У свою чергу, елемент Canvas, розміщуючи обєкти, запрошувати їх залежні властивості за допомогою методу GetValue і вибирає необхідні значення

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*