요약 - 10장. XAML 태그 확장

Download Sample 샘플 다운로드

참고 항목

이 책은 2016년 봄에 출간되었으며, 그 후로 업데이트되지 않았습니다. 이 책의 많은 내용이 지금까지도 무척 유용하나, 일부 내용은 오래되었고 올바르지 않거나 완전하지 않은 주제도 있습니다.

일반적으로 XAML 파서는 특성 값으로 설정된 모든 문자열을 기본 .NET 데이터 형식에 대한 표준 변환에 따른 속성의 형식으로 또는 TypeConverterAttribute를 사용하여 속성 또는 해당 형식에 연결된 TypeConverter 파생 항목으로 변환합니다.

그러나 경우에 따라 사전에 있는 항목, 정적 속성 또는 필드의 값과 같은 다른 원본에서 또는 일종의 계산을 통해 특성을 설정하는 것이 편리합니다.

이것은 XAML 태그 확장의 작업입니다. 이름에도 불구하고 XAML 태그 확장은 XML에 대한 확장이 아닙니다. XAML은 항상 유효한 XML입니다.

코드 인프라

XAML 태그 확장은 IMarkupExtension 인터페이스를 구현하는 클래스입니다. 이러한 클래스는 일반적으로 이름 끝에 Extension이 붙지만, XAML에는 일반적으로 해당 접미사 없이 표시됩니다.

다음 XAML 태그 확장은 모든 XAML 구현에서 지원됩니다.

이러한 네 가지 XAML 태그 확장은 Xamarin.Forms를 비롯한 여러 XAML 구현에서 지원됩니다.

추가 XAML 태그 확장은 RelativeLayout과 관련하여 Xamarin.Forms에 포함되어 있습니다.

정적 멤버 액세스

x:Static 요소를 사용하여 특성을 공용 정적 속성, 필드 또는 열거형 멤버의 값으로 설정합니다. Member 속성을 정적 멤버로 설정합니다. 일반적으로 x:Static 및 멤버 이름을 중괄호로 묶어 지정하는 것이 더 쉽습니다. Member 속성의 이름은 포함하지 않아도 되며, 멤버 자체만 포함합니다. 이 일반적인 구문은 SharedStatics 샘플에 나와 있습니다. 정적 필드 자체는 AppConstants 클래스에서 정의됩니다. 이 방법을 사용하면 프로그램을 통해 사용되는 상수를 설정할 수 있습니다.

SystemStatics 샘플에서 보여주듯이, 추가 XML 네임스페이스 선언을 사용하여 .NET 프레임워크에 정의된 공용 정적 속성, 필드 또는 열거형 멤버를 참조할 수 있습니다.

리소스 사전

VisualElement 클래스는 ResourceDictionary형식의 개체로 설정할 수 있는 Resources라는 속성을 정의합니다. XAML 내에서 이 사전에 항목을 저장하고 x:Key 특성으로 해당 항목을 식별할 수 있습니다. 리소스 사전에 저장된 항목은 항목에 대한 모든 참조에서 공유됩니다.

범용적인 StaticResource

대부분의 경우 ResourceSharing 샘플에서 보여주듯이 StaticResource 태그 확장을 사용하여 리소스 사전의 항목을 참조합니다. StaticResourceExtension 요소 또는 StaticResource를 중괄호 안에 사용할 수 있습니다.

Triple screenshot of resource sharing

x:Static 태그 확장과 StaticResource 태그 확장을 혼동해서는 안 됩니다.

사전 트리

XAML 파서는 StaticResource가 발견되면 일치하는 키에 대한 시각적 트리 검색을 시작한 다음, 애플리케이션의 App 클래스에서 ResourceDictionary을 찾습니다. 이렇게 하면 시각적 트리에서 더 하위에 있는 리소스 사전의 항목이 시각적 트리에서 더 상위에 있는 리소스 사전을 재정의할 수 있습니다. 이는 ResourceTrees 샘플에서 보여 줍니다.

특수 목적의 DynamicResource

StaticResource 태그 확장은 InitializeComponent 호출에서 시각적 트리가 빌드될 때 사전에서 항목을 검색합니다. StaticResource에 대한 대안은 사전 키에 대한 링크를 유지 관리하고 키에서 참조하는 항목이 변경될 때 대상을 업데이트하는 DynamicResource입니다.

StaticResourceDynamicResource의 차이점은 DynamicVsStatic 샘플에서 설명합니다.

DynamicResource에 의해 설정된 속성은 11장, 바인딩 가능한 인프라에서 설명된 대로 바인딩 가능한 속성에 의해 지원되어야 합니다.

덜 사용되는 태그 확장

x:Null 태그 확장을 사용하여 속성을 null로 설정합니다.

x:Type 태그 확장을 사용하여 속성을 .NET Type 개체로 설정합니다.

x:Array를 사용하여 배열을 정의합니다. [Type] 속성을 x:Type 태그 확장으로 설정하여 배열 멤버의 형식을 지정합니다.

사용자 지정 태그 확장

ProvideValue 메서드를 사용하여 IMarkupExtension 인터페이스를 구현하는 클래스를 작성하여 자체 XAML 태그 확장을 만들 수 있습니다.

HslColorExtension 클래스는 이러한 요구 사항을 충족합니다. H, S, LA라는 속성의 값을 기반으로 Color 형식의 값을 만듭니다. 이 클래스는 이 책에서 작성하고 사용하는 Xamarin.FormsBook.Toolkit라는 Xamarin.Forms 라이브러리의 첫 번째 항목입니다.

CustomExtensionDemo 샘플에서는 이 라이브러리를 참조하고 사용자 지정 태그 확장을 사용하는 방법을 보여 줍니다.