Расширения разметки XAML для многоплатформенных приложений .NET (.NET MAUI) помогают повысить мощность и гибкость XAML, позволяя задавать атрибуты элементов из различных источников.
Например, вы обычно задаете свойство Color для BoxView следующим образом:
XAML
<BoxViewColor="Blue" />
Однако вместо этого можно задать атрибут Color из значения, хранящегося в словаре ресурсов, или из значения статического свойства класса, созданного вами, или из свойства типа Color другого элемента на странице или из отдельного оттенка, насыщенности и значений света. Все эти параметры возможны с помощью расширений разметки XAML.
Расширение разметки отличается от способа выражения атрибута элемента. Расширения разметки XAML для .NET MAUI обычно можно определить по значению атрибута, заключенному в фигурные скобки:
XAML
<BoxViewColor="{StaticResource themeColor}" />
Любое значение атрибута в фигурных скобках всегда является расширением разметки в XAML. Однако расширения разметки XAML также можно использовать без использования фигурных скобок.
Примечание
Несколько расширений разметки XAML являются частью спецификации XAML 2009. Они отображаются в XAML-файлах с обычным префиксом пространства имен x, и обычно ссылаются на них с этим префиксом.
Помимо расширений разметки, описанных в этой статье, следующие расширения разметки включены в .NET MAUI и рассматриваются в других статьях:
RelativeSource — задает источник привязки относительно положения целевого объекта привязки. Дополнительные сведения см. в разделе Относительные привязки.
StaticResource — ссылается на объекты из словаря ресурсов. Дополнительные сведения см. в словарях ресурсов .
TemplateBinding — выполняет привязку данных из шаблона элемента управления. Для получения дополнительной информации см. шаблоны управления.
Расширение разметки x:Static
Расширение разметки x:Static поддерживается классом StaticExtension. Класс имеет одно свойство с именем Member типа string, которое вы задаете для имени общедоступной константы, статического свойства, статического поля или элемента перечисления.
Один из способов использования x:Static — сначала определить класс с некоторыми константами или статическими переменными, такими как этот класс AppConstants:
Этот синтаксис можно упростить, поместив класс StaticExtension и параметр члена в фигурные скобки. Результирующее выражение задается непосредственно атрибуту FontSize:
В этом примере в фигурных скобках нет кавычек. Свойство MemberStaticExtension больше не является XML-атрибутом. Вместо этого, он является частью выражения для расширения разметки.
Так же, как можно сократить x:StaticExtension до x:Static при использовании его в качестве элемента объекта, его можно сократить и в выражении в фигурных скобках:
Класс StaticExtension имеет атрибут ContentProperty, ссылающийся на свойство Member, которое помечает это свойство как свойство содержимого по умолчанию класса. Для расширений разметки XAML, задаваемых при помощи фигурных скобок, можно исключить часть выражения Member=:
Это наиболее распространенная форма расширения разметки x:Static.
Корневой тег примера XAML также содержит объявление пространства имен XML для пространства имен .NET System. Это позволяет задать размер шрифта Label с помощью статического поля Math.PI. Это приводит к довольно маленькому тексту, поэтому для свойства Scale задано значение Math.E:
XAML
<LabelText="π × E sized text"FontSize="{x:Static sys:Math.PI}"Scale="{x:Static sys:Math.E}"HorizontalOptions="Center" />
На следующем снимку экрана показаны выходные данные XAML:
Расширение разметки x:Reference
Расширение разметки x:Reference поддерживается классом ReferenceExtension. Класс имеет одно свойство с именем Name типа string, которое устанавливается на имя элемента на странице, которому присвоено имя с помощью x:Name. Это свойство Name является свойством содержимого ReferenceExtension, поэтому Name= не требуется, если x:Reference отображается в фигурных скобках. Расширение разметки x:Reference используется исключительно с привязками данных. Дополнительные сведения о привязках данных см. в привязки данных.
В следующем примере XAML показано два использования x:Reference с привязками данных, первое, где оно используется для задания свойства Source объекта Binding, а второй — для задания свойства BindingContext для двух привязок данных:
XAML
<ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Class="MarkupExtensions.ReferenceDemoPage"x:Name="page"Title="x:Reference Demo"><StackLayoutMargin="10, 0"><Labelx:DataType="ContentPage"Text="{Binding Source={x:Reference page},
StringFormat='The type of this page is {0}'}"FontSize="18"VerticalOptions="Center"HorizontalTextAlignment="Center" /><Sliderx:Name="slider"Maximum="360"VerticalOptions="Center" /><Labelx:DataType="Slider"BindingContext="{x:Reference slider}"Text="{Binding Value, StringFormat='{0:F0}° rotation'}"Rotation="{Binding Value}"FontSize="24"HorizontalOptions="Center"VerticalOptions="Center" /></StackLayout></ContentPage>
В этом примере оба выражения x:Reference используют сокращённое имя класса ReferenceExtension и исключают часть выражения Name=. В первом примере расширение разметки x:Reference внедрено в расширение разметки Binding, а свойства Source и StringFormat разделены запятыми.
На следующем снимку экрана показаны выходные данные XAML:
Расширение разметки x:Type
Расширение разметки x:Type является эквивалентом XAML ключевого слова typeof C#. Он поддерживается классом TypeExtension, который определяет свойство с именем TypeName типа string, которое должно быть присвоено имени класса или структуры. Расширение разметки x:Type возвращает объект Type этого класса или структуры.
TypeName является свойством содержимого TypeExtension, поэтому TypeName= не требуется, если x:Type отображается с фигурными скобками.
Расширение разметки x:Type обычно используется с расширением разметки x:Array. Дополнительные сведения см. в расширении разметки x:Array .
В следующем примере XAML демонстрируется, как использовать расширение разметки x:Type для создания объектов .NET MAUI и добавления их в StackLayout. XAML состоит из трех элементов Button с установленными свойствами Command равными Binding и свойствами CommandParameter, установленными для типов трех представлений .NET MAUI.
XAML
<ContentPagexmlns="http://schemas.microsoft.com/dotnet/2021/maui"xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"xmlns:local="clr-namespace:MarkupExtensions"x:Class="MarkupExtensions.TypeDemoPage"Title="x:Type Demo"x:DataType="local:TypeDemoPage"><StackLayoutx:Name="stackLayout"Padding="10, 0"><ButtonText="Create a Slider"HorizontalOptions="Center"VerticalOptions="Center"Command="{Binding CreateCommand}"CommandParameter="{x:Type Slider}" /><ButtonText="Create a Stepper"HorizontalOptions="Center"VerticalOptions="Center"Command="{Binding CreateCommand}"CommandParameter="{x:Type Stepper}" /><ButtonText="Create a Switch"HorizontalOptions="Center"VerticalOptions="Center"Command="{Binding CreateCommand}"CommandParameter="{x:Type Switch}" /></StackLayout></ContentPage>
Файл code-behind определяет и инициализирует свойство CreateCommand:
При нажатии Button создается новый экземпляр аргумента CommandParameter и добавляется в StackLayout. Три объекта Button затем совместно используют страницу с динамически созданными представлениями:
Универсальные типы можно указать с расширением разметки x:Type, указав универсальное ограничение в качестве префикса строкового аргумента в скобках:
В этом примере ViewCell создает простую BoxView для каждой записи цвета:
Примечание
При определении массивов распространенных типов, таких как строки и числа, используйте примитивные теги языка XAML, перечисленные в передаче аргументов .
Расширение разметки x:NULL
Расширение разметки x:Null поддерживается классом NullExtension. Он не имеет свойств и является просто эквивалентом XAML ключевого слова null C#.
В следующем примере XAML показано, как использовать расширение разметки x:Null:
В этом примере для Label определяется неявная Style, которая включает Setter, где свойство FontFamily устанавливается на определенный шрифт. Однако третий Label избегает использования шрифта, определенного в неявном стиле, задав FontFamily значение x:Null:
Расширение разметки DataTemplate
Расширение разметки DataTemplate позволяет преобразовать тип в DataTemplate. Он поддерживается классом DataTemplateExtension, который определяет свойство TypeName типа string, которое присваивается имени типа, который необходимо преобразовать в DataTemplate. Свойство TypeName является свойством содержимого DataTemplateExtension. Поэтому для выражений разметки XAML, выраженных с фигурными скобками, можно исключить TypeName= часть выражения.
В этом примере MonkeysPage преобразуется из ContentPage в DataTemplate, который задается в качестве значения свойства ShellContent.ContentTemplate. Это гарантирует, что MonkeysPage создается только при переходе на страницу, а не при запуске приложения.
Дополнительную информацию о приложениях Shell см. в разделе .
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET MAUI
.NET MAUI — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.