Типы и свойства в .NET MAUI XAML

Завершено

XAML — это декларативный язык разметки. Он разработан с целью упростить процесс создания пользовательского интерфейса. Элементы в XAML напрямую представляют создание экземпляров объектов, к которым вы получаете доступ в файлах кода программной части.

В этом уроке вы узнаете, как использовать типы, имеющиеся в языке XAML, а также задавать и читать значения свойств этих типов.

Где определяются типы?

В .NET MAUI реализовано средство синтаксического анализа XAML, которое анализирует объявленные элементы XAML и создает экземпляры каждого элемента в виде типа .NET. Диалект XAML, который понимает средство синтаксического анализа .NET MAUI, зависит от .NET MAUI, хотя он аналогичен использованию других платформ XAML, таких как Windows Presentation Foundation.

Типы .NET, реализующие код XAML элементов, идентифицируются кодом в нескольких сборках .NET. Многие из этих сборок входят в состав шаблонов .NET MAUI. Вы также можете использовать другие пользовательские типы, загружая соответствующие сборки в проект. Многие сборки доступны в виде пакетов NuGet. Большинство распространенных типов, используемых приложением MAUI, находятся в пакетах Microsoft.Maui.Dependencies и Microsoft.Maui.Extensions .

Каждый тип определяется в пространстве имен. В коде XAML необходимо указать пространства имен для типов, на которые вы ссылаетесь. Большинство элементов управления MAUI находятся в пространстве имен Microsoft.Maui.Controls, в пространство же имен Microsoft.Maui определены такие служебные типы, как Thickness, а пространство имен Microsoft.Maui.Graphics содержит такие универсальные типы, как Color. Возможность предоставлять типы таким образом подчеркивает расширяемость XAML. XAML позволяет создавать пользовательский интерфейс приложения и включать в него элементы .NET MAUI XAML, типы .NET и пользовательские типы. В большинстве случаев вам не нужно беспокоиться об этих пространствах имен, так как они используют неявную usings функцию C#, которая автоматически добавляет их на уровне приложения.

Как создавать экземпляры типов в XAML

При использовании XAML для создания пользовательского интерфейса сначала необходимо создать экземпляр типов элементов управления пользовательского интерфейса. В XAML можно создать объект заданного типа с помощью синтаксиса объектных элементов. Синтаксис элемента объекта — это стандартный, хорошо сформированный синтаксис XML для объявления элемента. Например, если вы хотите создать метку определенного цвета, код соответствующего элемента XAML будет выглядеть следующим образом:

<Label TextColor="AntiqueWhite"/>

Средство синтаксического анализа XAML .NET MAUI анализирует этот элемент XAML, чтобы создать экземпляр объекта в памяти. Фактически проанализированная XAML-метка соответствует следующему коду на C#:

var myLabel = new Label
{
  TextColor = Color.FromRgb(255, 255, 100)
};

Что такое пространство имен XAML?

Помните, что для того, чтобы средство синтаксического анализа XAML успешно проанализировало XAML-описание элемента управления на странице, оно должен иметь доступ к коду, который реализует этот элемент управления и определяет его свойства. Элементы управления, доступные странице .NET MAUI, реализованы в коллекции сборок, которые устанавливаются в составе NuGet-пакета Microsoft.Maui. Элементы управления находятся в пространствах имен .NET в этих сборках. В C#-коде пространство имен добавляется в нужную область с помощью директивыusing. На странице XAML вы ссылаетесь на пространство имен, используя атрибут xmlns этой страницы. В следующем коде показаны пространства имен, созданные на странице XAML, созданной в предыдущем уроке:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             ...>

    ...
</ContentPage>

Первое пространство имен — это пространство http://schemas.microsoft.com/dotnet/2021/mauiимен по умолчанию страницы. Эта форма URI пространства имен является типичной для XML, и выглядит несколько отличается от тех, с которыми вы можете ознакомиться в C#. Однако URI в данном случае — это просто псевдоним для одного или нескольких пространств имен, определенных сборками в NuGet-пакете Microsoft.Maui, поэтому при указании этого пространства имен в начале страницы все типы и элементы управления MAUI .NET становятся доступны в соответствующей области. Если не указать это пространство имен, вы не сможете использовать такие элементы управления, как Button, Label, Entryили StackLayout.

Второе пространство имен http://schemas.microsoft.com/winfx/2009/xaml ссылается на сборки, содержащие различные внутренние типы .NET, такие как строки, числовые значения и свойства. В приведенном выше коде XAML это пространство имен назначается псевдоним x. В коде XAML для этой страницы вы ссылались на типы в этом пространстве имен, используя префикс x:. Например, каждая страница XAML компилируется в класс, и вы указываете имя класса, созданного атрибутом x:Class страницы:

<ContentPage ...
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiXaml.Page1"
            ...>

    ...
</ContentPage>

Вы можете ссылаться на типы в собственных сборках в коде XAML с помощью пространства имен XAML. Например, если в коде XAML есть типы и методы, определенные в пространстве имен Utils в проекте, можно добавить пространство имен Utils на страницу, как показано в следующем коде. В этом примере для доступа к типам из этого пространства имен в качестве префикса используется псевдоним mycode.

<ContentPage ...
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:mycode="clr-namespace:Utils"
            ...>

    ...
</ContentPage>

Примечание.

Далее в этом модуле будут приведены дополнительные примеры использования этого метода.

Как указывать значения свойств в XAML

В XML атрибуты используются для описания элемента или предоставления информации о нем. В XAML атрибуты используются для задания свойств базового типа. Например, рассмотрим следующий код C#:

var label = new Label { Text = "Username", TextColor = Color.Black };

Этот оператор создает новый объект Label и задает свойства Text и TextColor. Чтобы задать свойства в XAML, необходимо использовать атрибуты. Соответствующий код XAML будет выглядеть так:

<Label Text="Username" TextColor="Black" />

Одна вещь, которую вы можете заметить, что в коде XAML отличается от кода C#, это значения свойств. Например, в C#-коде вы используете тип Color для свойства TextColor. Однако в определении XAML для TextColor задается строковое значение. Это связано с тем, что строка является единственным допустимым элементом, который можно использовать для значения атрибута XML. Поэтому должен быть способ преобразования каждого строкового значения в необходимый тип. В XAML это преобразование можно выполнить с помощью преобразователя типов.

Что такое преобразователь типов?

Преобразователь типов преобразует XML-атрибут, указанный как строковое значение, в правильный тип. Чтобы лучше понять эту концепцию, рассмотрим следующий пример:

<Label Text="Username" TextColor="Black" FontSize="42" FontAttributes="Bold,Italic" />

Этот код создает элемент Label и задает его свойства Text, TextColor, FontSize и FontAttributes.

Давайте начнем с первого свойства — Text. Текст уже является строковым значением, то есть в данном случае для страницы XAML не требуется преобразователь типов. Для следующего свойства TextColor используется тип Color, поэтому для XAML требуется преобразователь типов, чтобы преобразовать строку в соответствующее значение Color. Свойство FontSize — это целое число, то есть для XAML нужен преобразователь типов, чтобы преобразовать строку в целое число. Наконец, FontAttributes — это пример составного объекта. Значения можно объединить в виде строки с разделителями-запятыми: "Полужирный, курсив". Строка с разделителями-запятыми обрабатывается как перечисление на основе [Флагов], и соответствующий преобразователь типов будет применять побитовое OR значение к свойству.

.NET MAUI имеет преобразователи типов для большинства встроенных классов, и он использует эти преобразователи типов автоматически. Тем не менее, если определенный преобразователь не существует, можно написать собственный и привязать его к типу, чтобы он мог использоваться в XAML.

Назначение сложного типа

Преобразователи типов отлично подходят для простых параметров свойств; однако в некоторых случаях необходимо создать полный объект с помощью значения свойства. Решение этой проблемы изменяет назначение свойств для использования синтаксиса на основе элементов. Этот синтаксис называется формой элемента свойства. Этот синтаксис включает разбиение набора свойств в форму родительского дочернего элемента, где свойство выражается в теге элемента формы Type.PropertyName. Предположим, что вы хотите назначить распознаватель жестов метку, чтобы пользователь приложения смог коснуться метки. Распознаватель жестов представляет собой составной объект со своими свойствами. Как правило, эти свойства должны быть назначены, чтобы обеспечить правильную работу:

<TapGestureRecognizer NumberOfTapsRequired="2" />

Если вы хотите присвоить это значение объекту Label, можно записать код XAML следующим образом:

<Label Text="Username" TextColor="Black" FontSize="42" FontAttributes="Bold,Italic">
    <Label.GestureRecognizers>
        <TapGestureRecognizer NumberOfTapsRequired="2" />
    </Label.GestureRecognizers>
</Label>

Тип Label имеет свойство с именем GestureRecognizers. С помощью формы Property Element можно добавить объект TapGestureRecognizer в список жестов для элемента Label.

Свойство содержимого по умолчанию

Некоторые элементы управления .NET MAUI имеют свойство содержимого по умолчанию. Свойство содержимого позволяет указать значение свойства элемента управления без явного указания его в XAML. Рассмотрим следующий фрагмент XAML:

<VerticalStackLayout>
    <VerticalStackLayout.Children>
        <Label Text="Please log in" />
    </VerticalStackLayout.Children>
</VerticalStackLayout>

Этот код создает элемент VerticalStackLayout добавляет в него дочерний элемент Label. Так как обычно добавляет дочерние элементы в VerticalStackLayoutсвойство, его Children свойство является свойством содержимого по умолчанию. Это означает, что можно добавить дочерний элемент, не указывая Children явным образом, как показано ниже:

<VerticalStackLayout>
    <Label Text="Please log in" />
</VerticalStackLayout>

Проверка знаний

1.

Что делает преобразователь типов?

2.

Как добавить свои пользовательские типы в нужную область в XAML-файле?