Сводка Глава 10.Summary of Chapter 10. Расширения разметки XAMLXAML markup extensions

Загрузить образец загрузить примерDownload Sample Download the sample

Как правило, средство синтаксического анализа XAML преобразует любой строки задается как значение атрибута для типа свойства, в зависимости от стандартных преобразований для базовых типов данных .NET, или TypeConverter производных присоединенного к свойству, либо его тип TypeConverterAttribute.Normally, the XAML parser converts any string set as an attribute value to the type of the property based on standard conversions for the basic .NET data types, or a TypeConverter derivative attached to the property or its type with a TypeConverterAttribute.

Но иногда бывает удобно задать атрибут из другого источника, например, элемент в словарь, или значение статического свойства или поля, или из расчета какого-либо рода.But it's sometimes convenient to set an attribute from a different source, for example, an item in a dictionary, or the value of a static property or field, or from a calculation of some sort.

Это задание из расширения разметки XAML.This is the job of a XAML markup extension. Несмотря на название, расширения разметки XAML — не расширение XML.Despite the name, XAML markup extensions are not an extension to XML. XAML — это всегда юридические XML.XAML is always legal XML.

Код инфраструктурыThe code infrastructure

Расширение разметки XAML — это класс, реализующий IMarkupExtension интерфейс.A XAML markup extension is a class that implements the IMarkupExtension interface. Такой класс часто содержит слово Extension в конце имени но обычно отображается в XAML без этого суффикса.Such a class often has the word Extension at the end of its name but usually appears in XAML without that suffix.

Следующие расширения разметки XAML, поддерживаются все реализации XAML:The following XAML markup extensions are supported by all implementations of XAML:

Эти четыре расширения разметки XAML поддерживает многие реализации XAML, включая Xamarin.Forms:These four XAML markup extensions are supported by many implementations of XAML, including Xamarin.Forms:

Дополнительное расширение разметки XAML включен в Xamarin.Forms, в связи с RelativeLayout :An additional XAML markup extension is included in Xamarin.Forms in connection with RelativeLayout:

Доступ к статическим членамAccessing static members

Используйте x:Static задаваемого атрибута к значению общедоступного статического свойства, поля или перечисления члена элемента.Use the x:Static element to set an attribute to the value of a public static property, field, or enumeration member. Задайте Member свойство к статическому члену.Set the Member property to the static member. Обычно проще указать x:Static и имя члена в фигурные скобки.It's usually easier to specify x:Static and the member name in curly braces. Имя Member свойство не нужно быть включен, только сам элемент.The name of the Member property does not need to be included, just the member itself. Этот общий синтаксис показан в SharedStatics образца.This common syntax is shown in the SharedStatics sample. Статические поля, сами определяются в AppConstants класса.The static fields themselves are defined in the AppConstants class. Этот метод позволяет установить константы, используемые в программе.This technique allows you to establish constants used through a program.

С помощью дополнительных объявления пространства имен XML, вы может ссылаться на открытые статические свойства, поля или перечисления элементов, определенных в .NET framework, как показано в SystemStatics образца .With an additional XML namespace declaration, you can reference public static properties, fields, or enumeration members defined in the .NET framework, as demonstrated in the SystemStatics sample.

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

VisualElement Класс определяет свойство, именуемое Resources , можно присвоить объект типа ResourceDictionary .The VisualElement class defines a property named Resources that you can set to an object of type ResourceDictionary. В XAML, можно хранить элементы в данном словаре и определить их с помощью x:Key атрибута.Within XAML, you can store items in this dictionary and identify them with the x:Key attribute. Элементы, хранящиеся в словаре ресурсов являются общими для всех ссылок на элемент.The items stored in the resource dictionary are shared among all references to the item.

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

В большинстве случаев вы будете использовать StaticResource расширения разметки для ссылки на элемент из словаря ресурсов, как показано ResourceSharing образца .In most cases you'll use the StaticResource markup extension to reference an item from the resource dictionary, as demonstrated by the ResourceSharing sample. Можно использовать StaticResourceExtension элемент или StaticResource в фигурных скобках:You can use a StaticResourceExtension element or StaticResource within curly braces:

Тройной снимок общий доступ к ресурсамTriple screenshot of resource sharing

Не следует путать x:Static расширения разметки и StaticResource расширение разметки.Do not confuse the x:Static markup extension and the StaticResource markup extension.

Дерево словарейA tree of dictionaries

Когда средство синтаксического анализа XAML обнаруживает StaticResource, он начинает поиск вверх по визуальному дереву, ключ на соответствие и затем поиск выполняется в ResourceDictionary в приложения App класса.When the XAML parser encounters a StaticResource, it begins searching up the visual tree for a matching key, and then looks in the ResourceDictionary in the application's App class. Это позволяет элементов в словаре ресурсов глубже в визуальном дереве для переопределения словарь ресурсов, выше в визуальном дереве.This allows items in a resource dictionary deeper in the visual tree to override a resource dictionary higher in the visual tree. Это показано в ResourceTrees образца.This is demonstrated in the ResourceTrees sample.

DynamicResource для особых целейDynamicResource for special purposes

StaticResource Расширение разметки вызывает элемент, извлекаемый из словаря, при построении визуального дерева во время InitializeComponent вызова.The StaticResource markup extension causes an item to be retrieved from the dictionary when a visual tree is built during the InitializeComponent call. Альтернативой StaticResource DynamicResource , который хранит ссылку на ключ словаря и обновляет целевой объект в том случае, когда ссылка на элемент ключевых изменений.An alternative to StaticResource is DynamicResource, which maintains a link to the dictionary key and updates the target when the item referenced by the key changes.

Разница между StaticResource и DynamicResource демонстрируется в DynamicVsStatic образца.The difference between StaticResource and DynamicResource is demonstrated in the DynamicVsStatic sample.

Свойство, которому присвоен DynamicResource должна опираться на может быть привязано, как описано в Глава 11, инфраструктура связывания.A property set by DynamicResource must be backed by a bindable property as discussed in Chapter 11, The bindable infrastructure.

Расширения разметки, используется меньшееLesser-used markup extensions

Используйте x:Null расширение разметки, чтобы задать для свойства null.Use the x:Null markup extension to set a property to null.

Используйте x:Type расширение разметки, чтобы задать для свойства .NET Type объекта.Use the x:Type markup extension to set a property to a .NET Type object.

Используйте x:Array определить массив.Use x:Array to define an array. Укажите тип элементов массива, задав [Type] свойства x:Type расширение разметки.Specify the type of the array members by setting the [Type] property to an x:Type markup extension.

Пользовательское расширение разметкиA custom markup extension

Можно создать собственные расширения разметки XAML, написав класс, реализующий IMarkupExtension взаимодействовать с ProvideValue метод.You can create your own XAML markup extensions by writing a class that implements the IMarkupExtension interface with a ProvideValue method.

HslColorExtension Класс удовлетворяют этим требованиям.The HslColorExtension class satisfies those requirement. Он создает значение типа Color на основе значений свойств с именем H, S, L, и A.It creates a value of type Color based on values of properties named H, S, L, and A. Этот класс является первый элемент в библиотеку Xamarin.Forms Xamarin.FormsBook.Toolkit , сформированными и используется в ходе этой книги.This class is the first item in a Xamarin.Forms library named Xamarin.FormsBook.Toolkit that is built up and used over the course of this book.

CustomExtensionDemo образце показано, как сослаться на эту библиотеку, и использовать пользовательское расширение разметки.The CustomExtensionDemo sample demonstrates how to reference this library and use the custom markup extension.