Сводка по главе 10. Расширения разметки XAML

Download Sample Скачайте пример

Примечание.

Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.

Как правило, средство синтаксического анализа XAML преобразует любую строку, заданную в качестве значения атрибута, в тип свойства на основе стандартных преобразований для базовых типов данных .NET или производной класса TypeConverter, присоединенной к свойству или типу этого свойства с помощью TypeConverterAttribute.

Но иногда бывает удобно задать атрибут из другого источника, например элемента в словаре, значения статического свойства или поля или какого-нибудь вычисления.

Для этих целей и существует расширение разметки XAML. Несмотря на название, расширения разметки XAML не являются расширением языка XML. XAML — это всегда обычный XML.

Инфраструктура кода

Расширение разметки XAML — это класс, реализующий интерфейс IMarkupExtension. В конце имени такого класса часто содержится слово Extension, но обычно имя отображается в XAML без этого суффикса.

Следующие расширения разметки XAML поддерживаются во всех реализациях XAML:

Следующие четыре расширения разметки XAML поддерживаются во многих реализациях XAML, включая Xamarin.Forms:

Дополнительное расширение разметки XAML включено в Xamarin.Forms в связи с RelativeLayout:

Доступ к статическим элементам

Используйте элемент x:Static, чтобы задать для атрибута значение общего статического свойства, поля или элемента перечисления. Задайте для свойства Member статический элемент. Обычно проще указывать x:Static и имя элемента в фигурных скобках. Не обязательно включать имя свойства Member, достаточно указать сам элемент. Этот типичный синтаксис показан в примере SharedStatics. Сами статические поля определяются в классе AppConstants. Этот метод позволяет устанавливать константы, используемые в программе.

С помощью дополнительного объявления пространства имен XML можно ссылаться на общие статические свойства, поля или элементы перечисления, определенные в .NET Framework, как показано в примере SystemStatics.

Словари ресурсов

Класс VisualElement определяет свойство с именем Resources, которое можно задать для объекта типа ResourceDictionary. В XAML можно хранить элементы в этом словаре и указывать их с помощью атрибута x:Key. Элементы, хранящиеся в словаре ресурсов, являются общими для всех ссылок на этот элемент.

StaticResource для большинства целей

В большинстве случаев вы будете использовать расширение разметки StaticResource, чтобы сослаться на элемент из словаря ресурсов, как показано в примере ResourceSharing. Можно использовать элемент StaticResourceExtension или StaticResource в фигурных скобках.

Triple screenshot of resource sharing

Не путайте расширение разметки 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 показано, как ссылаться на эту библиотеку и применять пользовательское расширение разметки.