XAML 태그 확장 만들기
개발자 수준에서 .NET 다중 플랫폼 앱 UI(.NET MAUI) XAML 태그 확장은 또는 IMarkupExtension<T> 인터페이스를 IMarkupExtension 구현하는 클래스입니다. 파생하거나 IMarkupExtension<T>파생하여 사용자 고유의 사용자 지정 XAML 태그 확장을 정의할 수도 있습니다IMarkupExtension. 태그 확장에서 특정 형식의 값을 가져오는 경우 제네릭 양식을 사용합니다. 다음과 같은 몇 가지 .NET MAUI 태그 확장이 있습니다.
TypeExtension
은IMarkupExtension<Type>
에서 파생됩니다.ArrayExtension
은IMarkupExtension<Array>
에서 파생됩니다.DynamicResourceExtension
은IMarkupExtension<DynamicResource>
에서 파생됩니다.BindingExtension
은IMarkupExtension<BindingBase>
에서 파생됩니다.
또는 로 주석을 추가해야 RequireServiceAttribute AcceptEmptyServiceProviderAttribute하거나 IMarkupExtension<T> 구현 IMarkupExtension 해야 하는 모든 클래스 자세한 내용은 서비스 공급자를 참조 하세요.
두 IMarkupExtension 인터페이스는 각각 다음과 같은 ProvideValue
하나의 메서드만 정의합니다.
public interface IMarkupExtension
{
object ProvideValue(IServiceProvider serviceProvider);
}
public interface IMarkupExtension<out T> : IMarkupExtension
{
new T ProvideValue(IServiceProvider serviceProvider);
}
IMarkupExtension<T> 키워드ProvideValue
에서 IMarkupExtension 파생되고 포함 new
되므로 두 메서드가 모두 ProvideValue
포함됩니다.
XAML 태그 확장은 반환 값에 기여하는 속성을 정의하는 경우가 많으며 ProvideValue
메서드에는 단일 형식 인수가 있습니다 IServiceProvider
. 서비스 공급자에 대한 자세한 내용은 서비스 공급자를 참조 하세요.
태그 확장 만들기
다음 XAML 태그 확장은 사용자 고유의 태그 확장을 만드는 방법을 보여 줍니다. 색조, 채도 및 광도 구성 요소를 사용하여 값을 생성 Color 할 수 있습니다. 1로 초기화된 알파 구성 요소를 포함하여 색의 네 가지 구성 요소에 대한 네 가지 속성을 정의합니다. 클래스는 반환 값을 나타내 Color 기 위해 파생됩니다IMarkupExtension<Color>
.
public class HslColorExtension : IMarkupExtension<Color>
{
public float H { get; set; }
public float S { get; set; }
public float L { get; set; }
public float A { get; set; } = 1.0f;
public Color ProvideValue(IServiceProvider serviceProvider)
{
return Color.FromHsla(H, S, L, A);
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return (this as IMarkupExtension<Color>).ProvideValue(serviceProvider);
}
}
[AcceptEmptyServiceProvider]
public class HslColorExtension : IMarkupExtension<Color>
{
public float H { get; set; }
public float S { get; set; }
public float L { get; set; }
public float A { get; set; } = 1.0f;
public Color ProvideValue(IServiceProvider serviceProvider)
{
return Color.FromHsla(H, S, L, A);
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return (this as IMarkupExtension<Color>).ProvideValue(serviceProvider);
}
}
이 태그 확장은 서비스 공급자의 서비스를 사용하지 않으므로 주석이 추가됩니다 AcceptEmptyServiceProviderAttribute . 자세한 내용은 서비스 공급자를 참조 하세요.
IMarkupExtension<T> 파생되므로 IMarkupExtension클래스는 두 개의 ProvideValue
메서드를 포함해야 합니다. 하나는 메서드를 Color 반환하고 다른 메서드는 반환object
하지만 두 번째 메서드는 첫 번째 메서드를 호출할 수 있습니다.
태그 확장 사용
다음 XAML은 다음과 같은 색을 지정하기 위해 호출 HslColorExtension
하는 데 사용할 수 있는 다양한 방법을 보여 줍니다 BoxView.
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MarkupExtensions"
x:Class="MarkupExtensions.HslColorDemoPage"
Title="HSL Color Demo">
<ContentPage.Resources>
<Style TargetType="BoxView">
<Setter Property="WidthRequest" Value="80" />
<Setter Property="HeightRequest" Value="80" />
<Setter Property="HorizontalOptions" Value="Center" />
<Setter Property="VerticalOptions" Value="Center" />
</Style>
</ContentPage.Resources>
<StackLayout>
<BoxView>
<BoxView.Color>
<local:HslColorExtension H="0" S="1" L="0.5" A="1" />
</BoxView.Color>
</BoxView>
<BoxView>
<BoxView.Color>
<local:HslColor H="0.33" S="1" L="0.5" />
</BoxView.Color>
</BoxView>
<BoxView Color="{local:HslColorExtension H=0.67, S=1, L=0.5}" />
<BoxView Color="{local:HslColor H=0, S=0, L=0.5}" />
<BoxView Color="{local:HslColor A=0.5}" />
</StackLayout>
</ContentPage>
이 예제에서 XML 태그인 경우 HslColorExtension
네 개의 속성은 특성으로 설정되지만 중괄호 사이에 나타나면 네 개의 속성은 따옴표 없이 쉼표로 구분됩니다. 의 기본값H
은 0이고 L
기본값 A
은 1이므로 기본값으로 설정하려는 경우 해당 속성을 생략할 수 S
있습니다. 마지막 예제에서는 광도가 0이면 일반적으로 검은색이 되지만 알파 채널은 0.5이므로 반 투명하고 페이지의 흰색 배경에 회색으로 표시되는 예제를 보여 줍니다.
서비스 제공자
인수를 IServiceProvider
ProvideValue
사용하여 XAML 태그 확장 프로그램은 사용 중인 XAML 파일에 대한 데이터에 액세스할 수 있습니다. 예를 들어 서비스에서 IProvideValueTarget
태그 확장이 적용되는 개체에 대한 데이터를 검색할 수 있습니다.
IProvideValueTarget provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
인터페이스는 IProvideValueTarget
두 가지 속성을 정의하고 TargetProperty
. TargetObject
클래스 TargetObject
에서 이 정보를 가져올 때는 .의 BoxView속성입니다 TargetProperty
Color
.BoxView HslColorExtension
XAML 태그 확장이 설정된 속성입니다.
구현 IMarkupExtension 하거나 IMarkupExtension<T> 다음 중 하나를 RequireServiceAttribute AcceptEmptyServiceProviderAttribute사용하여 주석을 추가해야 하는 모든 클래스:
메서드에서
ProvideValue
사용할serviceProvider.GetService(typeof(T))
때마다 다음으로 클래스에 주석[RequireService(typeof(T))]
을 추가해야 합니다.[RequireService([typeof(IReferenceProvider), typeof(IProvideValueTarget)])] public class MyMarkupExtension : IMarkupExtension { public object ProvideValue(IServiceProvider serviceProvider) { ... var referenceProvider = serviceProvider.GetService<IReferenceProvider>(); var valueProvider = serviceProvider.GetService<IProvideValueTarget>() as IProvideParentValues ?? throw new ArgumentException("serviceProvider does not provide an IProvideValueTarget"); ... } }
태그 확장에서 서비스 공급자의 서비스를 사용하지 않는 경우 클래스에 주석을 추가
[AcceptEmptyServiceProvider]
해야 합니다.
이러한 주석은 앱 크기를 줄이고 런타임 성능을 향상시키는 데 도움이 되는 보다 효율적인 코드를 생성할 수 있도록 하는 XAML 컴파일러 최적화로 인해 필요합니다.
.NET MAUI