Сводка по главе 10. Расширения разметки XAML
Примечание.
Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.
Как правило, средство синтаксического анализа XAML преобразует любую строку, заданную в качестве значения атрибута, в тип свойства на основе стандартных преобразований для базовых типов данных .NET или производной класса TypeConverter
, присоединенной к свойству или типу этого свойства с помощью TypeConverterAttribute
.
Но иногда бывает удобно задать атрибут из другого источника, например элемента в словаре, значения статического свойства или поля или какого-нибудь вычисления.
Для этих целей и существует расширение разметки XAML. Несмотря на название, расширения разметки XAML не являются расширением языка XML. XAML — это всегда обычный XML.
Инфраструктура кода
Расширение разметки XAML — это класс, реализующий интерфейс IMarkupExtension
. В конце имени такого класса часто содержится слово Extension
, но обычно имя отображается в XAML без этого суффикса.
Следующие расширения разметки XAML поддерживаются во всех реализациях XAML:
x:Static
поддерживается вStaticExtension
.x:Reference
поддерживается вReferenceExtension
.x:Type
поддерживается вTypeExtension
.x:Null
поддерживается вNullExtension
.x:Array
поддерживается вArrayExtension
.
Следующие четыре расширения разметки XAML поддерживаются во многих реализациях XAML, включая Xamarin.Forms:
StaticResource
поддерживается вStaticResourceExtension
.DynamicResource
поддерживается вDynamicResourceExtension
.Binding
BindingExtension
поддерживается в разделе 16. Привязка данныхTemplateBinding
TemplateBindingExtension
поддерживается не в книге
Дополнительное расширение разметки XAML включено в Xamarin.Forms в связи с RelativeLayout
:
ConstraintExpression
— не рассматривается в книге
Доступ к статическим элементам
Используйте элемент x:Static
, чтобы задать для атрибута значение общего статического свойства, поля или элемента перечисления. Задайте для свойства Member
статический элемент. Обычно проще указывать x:Static
и имя элемента в фигурных скобках. Не обязательно включать имя свойства Member
, достаточно указать сам элемент. Этот типичный синтаксис показан в примере SharedStatics. Сами статические поля определяются в классе AppConstants
. Этот метод позволяет устанавливать константы, используемые в программе.
С помощью дополнительного объявления пространства имен XML можно ссылаться на общие статические свойства, поля или элементы перечисления, определенные в .NET Framework, как показано в примере SystemStatics.
Словари ресурсов
Класс VisualElement
определяет свойство с именем Resources
, которое можно задать для объекта типа ResourceDictionary
. В XAML можно хранить элементы в этом словаре и указывать их с помощью атрибута x:Key
. Элементы, хранящиеся в словаре ресурсов, являются общими для всех ссылок на этот элемент.
StaticResource для большинства целей
В большинстве случаев вы будете использовать расширение разметки StaticResource
, чтобы сослаться на элемент из словаря ресурсов, как показано в примере ResourceSharing. Можно использовать элемент StaticResourceExtension
или StaticResource
в фигурных скобках.
Не путайте расширение разметки x:Static
и расширение разметки StaticResource
.
Дерево словарей
Когда средство синтаксического анализа XAML встречает StaticResource
, оно начинает поиск соответствующего ключа в визуальном дереве, а затем — поиск в ResourceDictionary
в классе App
приложения. Это позволяет элементам словаря ресурсов, расположенным более глубоко в визуальном дереве, переопределять словарь ресурсов, находящийся выше в визуальном дереве. Это показано в примере ResourceTrees.
DynamicResource для особых целей
Расширение разметки StaticResource
извлекает элемент из словаря при построении визуального дерева во время вызова InitializeComponent
. Альтернативой StaticResource
является расширение DynamicResource
, которое поддерживает ссылку на ключ словаря и обновляет целевой объект при изменении элемента, на который ссылается ключ.
Разница между StaticResource
и DynamicResource
показана в примере DynamicVsStatic.
Свойство, заданное DynamicResource
, должно поддерживаться привязываемым свойством, как описано в главе 11 "Инфраструктура c возможностью привязки".
Менее часто используемые расширения разметки
Используйте расширение разметки x:Null
, чтобы задать для свойства значение null
.
Используйте расширение разметки x:Type
, чтобы задать свойство для объекта .NET Type
.
Для определения массива используйте x:Array
. Чтобы указать тип элементов массива, задайте для свойства [Type
] расширение разметки x:Type
.
Пользовательское расширение разметки
Вы можете создавать собственные расширения разметки XAML, создав класс, реализующий интерфейс IMarkupExtension
, с помощью метода ProvideValue
.
Класс HslColorExtension
соответствует этому требованию. Он создает значение типа Color
на основе значений свойств с именами H
, S
, L
и A
. Этот класс является первым элементом в библиотеке Xamarin.Forms под названием Xamarin.FormsBook.Toolkit, который создается и используется в этой книге.
В примере CustomExtensionDemo показано, как ссылаться на эту библиотеку и применять пользовательское расширение разметки.