Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Примечание.
Эта книга была опубликована весной 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.
