Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
</Canvas>
Присоединяемые свойства являются специализированной формой специфичной для WPF концепции, которая называется свойством зависимости. Если только свойство не было реализовано в весьма специальной манере, то его значение не может быть установлено с использованием синтаксиса присоединяемых свойств. Свойства зависимости подробно исследуются в главе 25.
На заметку! В Visual Studio имеется средство
IntelliSense
Понятие расширений разметки XAML
Как уже объяснялось, значения свойств чаще всего представляются в виде простой строки или через синтаксис "свойство-элемент". Однако существует еще один способ указать значение атрибута XAML — применение расширений разметки. Расширения разметки позволяют анализатору XAML получать значение для свойства из выделенного внешнего класса. Это может обеспечить большие преимущества, поскольку для получения значений некоторых свойств требуется выполнение множества операторов кода.
Расширения разметки предлагают способ аккуратного расширения грамматики XAML новой функциональностью. Расширение разметки внутренне представлено как класс, производный от
MarkupExtension
х:Array
x:Null
х:Static
х:Туре
Расширение разметки помещается между фигурными скобками:
<i><Элемент УстанавливаемоеСвойство = "{ РасширениеРазметки }" /></i>
Чтобы увидеть расширение разметки в действии, введите в редакторе Kaxaml следующий код:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:CorLib="clr-namespace:System;assembly=mscorlib">
<StackPanel>
<b> <!-- Расширение разметки Static позволяет получать значение</b>
<b> статического члена класса --></b>
<Label Content ="{x:Static CorLib:Environment.OSVersion}"/>
<Label Content ="{x:Static CorLib:Environment.ProcessorCount}"/>
<b> <!-- Расширение разметки Type - это версия XAML</b>
<b> операции typeof языка C# —></b>
<Label Content ="{x:Type Button}" />
<Label Content ="{x:Type CorLib:Boolean}" />
<b> <! — Наполнение элемента ListBox массивом строк -- ></b>
<ListBox Width="200" Height="50">
<ListBox.ItemsSource>
<x:Array Type="CorLib:String">
<CorLib:String>Sun Kil Moon</CorLib:String>
<CorLib:String>Red House Painters</CorLib:String>
<CorLib:String>Besnard Lakes</CorLib:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
</StackPanel>
</Page>
Прежде всего, обратите внимание, что определение
<Page>
System
mscorlib.dll
х:Static
OSVersion
ProcessorCount
System.Environment
Расширение разметки
х:Туре
Label
Button
System.Boolean
Наиболее интересная часть показанной выше разметки связана с элементом
ListBox
Itemsourсе
х:Array
<x:Array Type="CorLib:String">
<CorLib:String>Sun Kil Moon</CorLib:String>
<CorLib:String>Red House Painters</CorLib:String>
<CorLib:String>Besnard Lakes</CorLib:String>
</x:Array>
На заметку! Предыдущий пример XAML служит только для иллюстрации расширения разметки в действии. Как будет показано в главе 25, существуют гораздо более простые способы наполнения элементов управления
ListBox
На рис. 24.3 представлена разметка этого элемента
<Page>

Вы уже видели многочисленные примеры, которые демонстрировали основные аспекты синтаксиса XAML. Вы наверняка согласитесь, что XAML интересен своей возможностью описывать деревья объектов .NET в декларативной манере. Хотя это исключительно полезно при конфигурировании графических пользовательских интерфейсов, не забывайте о том, что с помощью XAML можно описывать любой тип из любой сборки при условии, что он является неабстрактным и содержит стандартный конструктор.