의 XAML 사용자 지정 네임스페이스 스키마 Xamarin.Forms

Download Sample 샘플 다운로드

라이브러리의 형식은 CLR(공용 언어 런타임) 네임스페이스 이름과 어셈블리 이름을 지정하는 네임스페이스 선언과 함께 라이브러리에 대한 XAML 네임스페이스를 선언하여 XAML에서 참조할 수 있습니다.

<ContentPage ...
             xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
    ...
</ContentPage>

그러나 정의에 CLR 네임스페이스 및 어셈블리 이름을 지정하는 것은 xmlns 어색하고 오류가 발생하기 쉽습니다. 또한 라이브러리에 여러 네임스페이스의 형식이 포함된 경우 여러 XAML 네임스페이스 선언이 필요할 수 있습니다.

다른 방법은 하나 이상의 CLR 네임스페이스에 매핑되는 사용자 지정 네임스페이스 스키마(예: http://mycompany.com/schemas/controls사용자 지정 네임스페이스 스키마)를 정의하는 것입니다. 이렇게 하면 단일 XAML 네임스페이스 선언이 다른 네임스페이스에 있더라도 어셈블리의 모든 형식을 참조할 수 있습니다. 또한 단일 XAML 네임스페이스 선언을 사용하여 여러 어셈블리의 형식을 참조할 수 있습니다.

XAML 네임스페이스에 대한 자세한 내용은 다음의 Xamarin.FormsXAML 네임스페이스를 참조하세요.

사용자 지정 네임스페이스 스키마 정의

샘플 애플리케이션에는 다음과 같은 CircleButton몇 가지 간단한 컨트롤을 노출하는 라이브러리가 포함되어 있습니다.

using Xamarin.Forms;

namespace MyCompany.Controls
{
    public class CircleButton : Button
    {
        ...
    }
}

라이브러리의 모든 컨트롤은 네임스페이스에 MyCompany.Controls 있습니다. 이러한 컨트롤은 사용자 지정 네임스페이스 스키마를 통해 호출 어셈블리에 노출될 수 있습니다.

사용자 지정 네임스페이스 스키마는 XAML 네임스페이스와 하나 이상의 CLR 네임스페이스 간의 매핑을 지정하는 클래스로 정의 XmlnsDefinitionAttribute 됩니다. XAML XmlnsDefinitionAttribute 네임스페이스 이름과 CLR 네임스페이스 이름의 두 인수를 사용합니다. XAML 네임스페이스 이름은 속성에 XmlnsDefinitionAttribute.XmlNamespace 저장되고 CLR 네임스페이스 이름은 속성에 XmlnsDefinitionAttribute.ClrNamespace 저장됩니다.

참고 항목

클래스에는 XmlnsDefinitionAttribute 어셈블리의 이름으로 선택적으로 설정할 수 있는 이름이 있는 AssemblyName속성도 있습니다. 이는 A에서 XmlnsDefinitionAttribute 참조된 CLR 네임스페이스가 외부 어셈블리에 있는 경우에만 필요합니다.

사용자 XmlnsDefinitionAttribute 지정 네임스페이스 스키마에 매핑될 CLR 네임스페이스가 포함된 프로젝트의 어셈블리 수준에서 정의해야 합니다. 다음 예제에서는 샘플 애플리케이션의 AssemblyInfo.cs 파일을 보여줍니다.

using Xamarin.Forms;
using MyCompany.Controls;

[assembly: Preserve]
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]

이 코드는 URL을 CLR 네임스페이스에 매핑 http://mycompany.com/schemas/controls 하는 사용자 지정 네임스페이스 스키마를 MyCompany.Controls 만듭니다. 또한 링커가 어셈블리의 Preserve 모든 형식을 유지하도록 어셈블리에 특성이 지정됩니다.

Important

특성은 Preserve 사용자 지정 네임스페이스 스키마를 통해 매핑되거나 전체 어셈블리에 적용되는 어셈블리의 클래스에 적용되어야 합니다.

그런 다음 사용자 지정 네임스페이스 스키마를 XAML 파일의 형식 확인에 사용할 수 있습니다.

사용자 지정 네임스페이스 스키마 사용

사용자 지정 네임스페이스 스키마에서 형식을 사용하려면 XAML 컴파일러에서 형식을 사용하는 어셈블리에서 형식을 정의하는 어셈블리에 대한 코드 참조가 있어야 합니다. 이 작업은 XAML을 통해 사용될 형식을 정의하는 메서드를 포함하는 Init 클래스를 어셈블리에 추가하여 수행할 수 있습니다.

namespace MyCompany.Controls
{
    public static class Controls
    {
        public static void Init()
        {
        }
    }
}

Init 그런 다음, 사용자 지정 네임스페이스 스키마의 형식을 사용하는 어셈블리에서 메서드를 호출할 수 있습니다.

using Xamarin.Forms;
using MyCompany.Controls;

namespace CustomNamespaceSchemaDemo
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            Controls.Init();
            InitializeComponent();
        }
    }
}

Warning

이러한 코드 참조를 포함하지 않으면 XAML 컴파일러가 사용자 지정 네임스페이스 스키마 형식이 포함된 어셈블리를 찾을 수 없게 됩니다.

컨트롤을 CircleButton 사용하려면 사용자 지정 네임스페이스 스키마 URL을 지정하는 네임스페이스 선언과 함께 XAML 네임스페이스가 선언됩니다.

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="http://mycompany.com/schemas/controls"
             x:Class="CustomNamespaceSchemaDemo.MainPage">
    <StackLayout Margin="20,35,20,20">
        ...
        <controls:CircleButton Text="+"
                               BackgroundColor="Fuchsia"
                               BorderColor="Black"
                               CircleDiameter="100" />
        <controls:CircleButton Text="-"
                               BackgroundColor="Teal"
                               BorderColor="Silver"
                               CircleDiameter="70" />
        ...
    </StackLayout>
</ContentPage>

CircleButton그런 다음 네임스페이스 접두사를 사용하여 선언하여 인스턴스를 controls 추가할 ContentPage 수 있습니다.

사용자 지정 네임스페이스 스키마 형식 Xamarin.Forms 을 찾으려면 참조된 어셈블리에서 인스턴스를 XmlnsDefinitionAttribute 검색합니다. xmlns XAML 파일의 요소에 대한 특성이 a의 속성 값 XmlnsDefinitionAttributeXamarin.Forms 과 일치하는 XmlNamespace 경우 형식의 확인을 위해 속성 값을 사용 XmlnsDefinitionAttribute.ClrNamespace 하려고 시도합니다. 형식 확인에 실패 Xamarin.Forms 하면 일치하는 XmlnsDefinitionAttribute 추가 인스턴스를 기반으로 형식 확인을 계속 시도합니다.

그 결과 두 개의 CircleButton 인스턴스가 표시됩니다.

Circle buttons