Сводная информация о Главе 7. Сравнение XAML и кода
Примечание.
Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.
Xamarin.Forms поддерживает язык разметки XAML, основанный на формате XML. Это название расшифровывается как "расширяемый язык разметки для приложений" (Extensible Application Markup Language) и произносится "заммель". XAML можно использовать вместо C# для определения макета пользовательского интерфейса в приложении Xamarin.Forms и для определения привязок между элементами пользовательского интерфейса и базовыми данными.
Свойства и атрибуты
Классы и структуры Xamarin.Forms в формате XAML становятся XML-элементами, а свойства этих классов и структур становятся XML-атрибутами. Чтобы стать экземпляром XAML, класс должен иметь открытый конструктор без параметров. Для всех свойств в XAML должны существовать открытые методы доступа set
.
Для свойств базовых типов данных (string
, double
, bool
и т. д.) средство синтаксического анализа XAML использует стандартные методы TryParse
, чтобы преобразовать параметры атрибутов в эти типы. Средство синтаксического анализа XAML также может легко управлять типами перечисления и комбинировать члены перечисления, если тип перечисления помечен атрибутом Flags
.
Чтобы помочь средству синтаксического анализа XAML, более сложные типы (или свойства этих типов) могут включать TypeConverterAttribute
с определением класса, производного от TypeConverter
и поддерживающего преобразование строковых значений в эти типы. Например, ColorTypeConverter
преобразует имена и строковые значения цветов, такие как "#rrggbb", в значения Color
.
Синтаксис "элемент — свойство"
В XAML классы и созданные из них объекты выражаются в виде XML-элементов. Они называются здесь объектными элементами. Большинство свойств этих объектов выражаются в виде XML-атрибутов. Они, в свою очередь, называются атрибутами свойств.
Иногда свойству нужно присвоить объект, который невозможно выразить простой строкой. Для таких случаев XAML поддерживает тег типа элемент — свойство, который состоит из имени класса и имени свойства, разделенных точкой. Объектный элемент может присутствовать в паре тегов "элемент — свойство".
Добавление страницы XAML в проект
Переносимая библиотека классов Xamarin.Forms может содержать страницу XAML при первом создании, а также вы можете добавить страницу XAML в уже существующий проект. В диалоговом окне добавления нового элемента выберите элемент, который ссылается на страницу XAML, или ContentPage
и XAML. (Нельзя использовать ContentView
.)
Примечание.
Параметры Visual Studio изменились с момента написания этой главы.
Создаются два файла: XAML-файл с расширением .xaml и файл C# с расширением .xaml.cs. Этот файл C# часто называют кодом программной части для XAML-файла. Файл кода программной части содержит определение разделяемого класса, производное от ContentPage
. Во время сборки анализируется файл XAML и для того же класса создается второе определение разделяемого класса. Этот созданный класс включает метод с именем InitializeComponent
, который вызывается из конструктора в файле кода программной части.
Во время выполнения при завершении вызова InitializeComponent
все элементы XAML-файла уже созданы и инициализированы так же, как если бы они были созданы в коде C#.
Корневой элемент в файле XAML — это ContentPage
. Корневой тег содержит по крайней мере два объявления пространств имен XML: одно для элементов Xamarin.Forms, а второе определяет префикс x
для элементов и атрибутов, встроенных во все реализации XAML. Корневой тег также содержит атрибут x:Class
, который указывает на пространство имен и имя класса, производного от ContentPage
. Они соответствуют пространству имен и имени класса в файле кода программной части.
Такое сочетание XAML и кода демонстрируется в примере CodePlusXaml.
Компилятор XAML
В Xamarin.Forms есть собственный компилятор XAML, но его использование не является обязательным и определяется использованием XamlCompilationAttribute
. Если XAML не компилируется, XAML-файл анализируется во время сборки и внедряется в PCL, где снова анализируется во время выполнения. Если XAML компилируется, процесс сборки преобразует XAML в двоичный код, и благодаря этому обработка в среде выполнения становится эффективнее.
Особенности платформ в XAML-файле
В XAML класс OnPlatform
можно использовать для выбора разметки, зависящей от платформы. Это универсальный класс, экземпляр которого должен создаваться с атрибутом x:TypeArguments
, который соответствует целевому типу. Класс OnIdiom
используется так же, но не очень распространен.
Использование OnPlatform
изменилось с момента публикации книги. Изначально он использовался в сочетании со свойствами с именами iOS
, Android
и WinPhone
. Теперь он применяется с дочерними объектами On
. Задайте для свойства Platform
строковое значение, соответствующее общим полям const
класса Device
. Задайте для свойства Value
значение, соответствующее атрибуту x:TypeArguments
тега OnPlatform
.
OnPlatform
демонстрируется в примере ScaryColorList. Название примера связано с тем, что в нем есть несколько практически идентичных блоков XAML. Существование таких повторов разметки предполагает, что должны существовать и методы для их сокращения.
Атрибуты свойства содержимого
Некоторые элементы свойств встречаются довольно часто, например тег <ContentPage.Content>
в корневом элементе ContentPage
или тег <StackLayout.Children>
с дочерними элементами StackLayout
.
Каждому классу разрешается определить одно свойство ContentPropertyAttribute
. Для этого свойства теги "свойство — элемент" не являются обязательными. ContentPage
определяет свойство содержимого как Content
, а Layout<T>
(класс, от которого наследуется StackLayout
) определяет свойство содержимого как Children
. Эти теги "свойство — элемент" не являются обязательными.
Для Label
тег "свойство — элемент" имеет значение Text
.
Форматированный текст
Пример TextVariations содержит несколько операций присвоения свойство Text
и FormattedText
для Label
. В XAML объекты Span
отображаются как дочерние элементы объекта FormattedString
.
При присвоении свойству Text
многострочного строкового значения все символы конца строки преобразуются в пробелы, но эти символы конца строки сохраняются, если многострочная строка используется как содержимое тегов Label
или Label.Text
.