Поделиться через


Сводная информация о Главе 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.

Три снимка экрана с вариантами отображения текста