На уровне разработчика расширение разметки XAML для многоплатформенного интерфейса приложения .NET (.NET MAUI) — это класс, реализующий IMarkupExtension интерфейс или IMarkupExtension<T> интерфейс. Кроме того, можно определить собственные расширения разметки XAML, производные от IMarkupExtension или IMarkupExtension<T>. Используйте универсальную форму, если расширение разметки получает значение определенного типа. Это относится к нескольким расширениям разметки MAUI .NET:
TypeExtension происходит от IMarkupExtension<Type>.
ArrayExtension происходит от IMarkupExtension<Array>.
DynamicResourceExtension происходит от IMarkupExtension<DynamicResource>.
BindingExtension происходит от IMarkupExtension<BindingBase>.
Так как IMarkupExtension<T> он является производным от IMarkupExtension ключевого слова и включает ключевое new слово в ProvideValue, он содержит оба ProvideValue метода.
Часто расширения разметки XAML определяют свойства, которые вносят вклад в возвращаемое значение, и ProvideValue метод имеет один аргумент типа IServiceProvider. Дополнительные сведения о поставщиках услуг см. в разделе "Поставщики услуг".
Создание расширения разметки
В следующем расширении разметки XAML показано, как создать собственное расширение разметки. Он позволяет создавать Color значение с помощью компонентов оттенка, насыщенности и светимости. Он определяет четыре свойства для четырех компонентов цвета, включая альфа-компонент, инициализированный до 1. Класс является производным от IMarkupExtension<Color> указания возвращаемого Color значения:
C#
publicclassHslColorExtension : IMarkupExtension<Color>
{
publicfloat H { get; set; }
publicfloat S { get; set; }
publicfloat L { get; set; }
publicfloat A { get; set; } = 1.0f;
public Color ProvideValue(IServiceProvider serviceProvider)
{
return Color.FromHsla(H, S, L, A);
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return (thisas IMarkupExtension<Color>).ProvideValue(serviceProvider);
}
}
C#
[AcceptEmptyServiceProvider]
publicclassHslColorExtension : IMarkupExtension<Color>
{
publicfloat H { get; set; }
publicfloat S { get; set; }
publicfloat L { get; set; }
publicfloat A { get; set; } = 1.0f;
public Color ProvideValue(IServiceProvider serviceProvider)
{
return Color.FromHsla(H, S, L, A);
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return (thisas IMarkupExtension<Color>).ProvideValue(serviceProvider);
}
}
Это расширение разметки аннотировано, AcceptEmptyServiceProviderAttribute так как оно не использует службу от поставщика услуг. Дополнительные сведения см. в разделе "Поставщики услуг".
Поскольку IMarkupExtension<T> наследуется от IMarkupExtensionкласса, класс должен содержать два ProvideValue метода, один возвращает и другой, который возвращает Color , objectно второй метод может вызывать первый метод.
Использование расширения разметки
Следующий код XAML демонстрирует различные подходы, которые можно использовать для вызова HslColorExtension цвета для указания цвета:BoxView
В этом примере при HslColorExtension использовании XML-тега четыре свойства задаются как атрибуты, но при отображении между фигурными скобками четыре свойства разделяются запятыми без кавычки. Значения по умолчанию для H, Sи L равны 0, а значение A по умолчанию равно 1, поэтому эти свойства могут быть опущены, если они задают значения по умолчанию. В последнем примере показан пример, в котором светимость составляет 0, что обычно приводит к черному цвету, но альфа-канал равен 0,5, поэтому он является полупрозрачным и отображается серым на белом фоне страницы:
Поставщики услуг
С помощью аргумента IServiceProviderProvideValueрасширения разметки XAML могут получить доступ к данным о XAML-файле, в котором они используются. Например, служба позволяет получить данные об объекте, IProvideValueTarget к которого применяется расширение разметки:
C#
IProvideValueTarget provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
Интерфейс IProvideValueTarget определяет два свойства и TargetObjectTargetProperty. Если эти сведения получены в HslColorExtension классе, TargetObject это BoxView свойство и TargetProperty свойство ColorBoxView. Это свойство, в котором задано расширение разметки XAML.
Для каждого использования serviceProvider.GetService(typeof(T)) в методе ProvideValue класс должен быть помечен следующим [RequireService(typeof(T))]образом:
C#
[RequireService([typeof(IReferenceProvider), typeof(IProvideValueTarget)])]
publicclassMyMarkupExtension : IMarkupExtension
{
publicobjectProvideValue(IServiceProvider serviceProvider)
{
...
var referenceProvider = serviceProvider.GetService<IReferenceProvider>();
var valueProvider = serviceProvider.GetService<IProvideValueTarget>() as IProvideParentValues
?? thrownew ArgumentException("serviceProvider does not provide an IProvideValueTarget");
...
}
}
Если расширение разметки не использует какую-либо службу от поставщика услуг, класс должен быть замечен.[AcceptEmptyServiceProvider]
Эти заметки необходимы из-за оптимизации компилятора XAML, которая позволяет создавать более эффективный код, что помогает уменьшить размер приложения и повысить производительность среды выполнения.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET MAUI
.NET MAUI — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.