XAML 태그 확장 만들기

샘플을 찾아봅니다. 샘플 찾아보기

개발자 수준에서 .NET 다중 플랫폼 앱 UI(.NET MAUI) XAML 태그 확장은 또는 IMarkupExtension<T> 인터페이스를 IMarkupExtension 구현하는 클래스입니다. 파생하거나 IMarkupExtension<T>파생하여 사용자 고유의 사용자 지정 XAML 태그 확장을 정의할 수도 있습니다IMarkupExtension. 태그 확장에서 특정 형식의 값을 가져오는 경우 제네릭 양식을 사용합니다. 다음과 같은 몇 가지 .NET MAUI 태그 확장이 있습니다.

  • TypeExtensionIMarkupExtension<Type>에서 파생됩니다.
  • ArrayExtensionIMarkupExtension<Array>에서 파생됩니다.
  • DynamicResourceExtensionIMarkupExtension<DynamicResource>에서 파생됩니다.
  • BindingExtensionIMarkupExtension<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이므로 반 투명하고 페이지의 흰색 배경에 회색으로 표시되는 예제를 보여 줍니다.

HSL 색 데모.

서비스 제공자

인수를 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 컴파일러 최적화로 인해 필요합니다.