요약 - 10장. XAML 태그 확장
참고 항목
이 책은 2016년 봄에 출간되었으며, 그 후로 업데이트되지 않았습니다. 이 책의 많은 내용이 지금까지도 무척 유용하나, 일부 내용은 오래되었고 올바르지 않거나 완전하지 않은 주제도 있습니다.
일반적으로 XAML 파서는 특성 값으로 설정된 모든 문자열을 기본 .NET 데이터 형식에 대한 표준 변환에 따른 속성의 형식으로 또는 TypeConverterAttribute
를 사용하여 속성 또는 해당 형식에 연결된 TypeConverter
파생 항목으로 변환합니다.
그러나 경우에 따라 사전에 있는 항목, 정적 속성 또는 필드의 값과 같은 다른 원본에서 또는 일종의 계산을 통해 특성을 설정하는 것이 편리합니다.
이것은 XAML 태그 확장의 작업입니다. 이름에도 불구하고 XAML 태그 확장은 XML에 대한 확장이 아닙니다. XAML은 항상 유효한 XML입니다.
코드 인프라
XAML 태그 확장은 IMarkupExtension
인터페이스를 구현하는 클래스입니다. 이러한 클래스는 일반적으로 이름 끝에 Extension
이 붙지만, XAML에는 일반적으로 해당 접미사 없이 표시됩니다.
다음 XAML 태그 확장은 모든 XAML 구현에서 지원됩니다.
x:Static
:StaticExtension
에서 지원x:Reference
:ReferenceExtension
에서 지원x:Type
:TypeExtension
에서 지원x:Null
:NullExtension
에서 지원x:Array
:ArrayExtension
에서 지원
이러한 네 가지 XAML 태그 확장은 Xamarin.Forms를 비롯한 여러 XAML 구현에서 지원됩니다.
StaticResource
:StaticResourceExtension
에서 지원DynamicResource
:DynamicResourceExtension
에서 지원Binding
BindingExtension
16장에서 설명한 에서 지원합니다. 데이터 바인딩TemplateBinding
지원됨TemplateBindingExtension
- 책에서 다루지 않음
추가 XAML 태그 확장은 RelativeLayout
과 관련하여 Xamarin.Forms에 포함되어 있습니다.
ConstraintExpression
- 책에서 다루지 않음
정적 멤버 액세스
x:Static
요소를 사용하여 특성을 공용 정적 속성, 필드 또는 열거형 멤버의 값으로 설정합니다. Member
속성을 정적 멤버로 설정합니다. 일반적으로 x:Static
및 멤버 이름을 중괄호로 묶어 지정하는 것이 더 쉽습니다. Member
속성의 이름은 포함하지 않아도 되며, 멤버 자체만 포함합니다. 이 일반적인 구문은 SharedStatics 샘플에 나와 있습니다. 정적 필드 자체는 AppConstants
클래스에서 정의됩니다. 이 방법을 사용하면 프로그램을 통해 사용되는 상수를 설정할 수 있습니다.
SystemStatics 샘플에서 보여주듯이, 추가 XML 네임스페이스 선언을 사용하여 .NET 프레임워크에 정의된 공용 정적 속성, 필드 또는 열거형 멤버를 참조할 수 있습니다.
리소스 사전
VisualElement
클래스는 ResourceDictionary
형식의 개체로 설정할 수 있는 Resources
라는 속성을 정의합니다. XAML 내에서 이 사전에 항목을 저장하고 x:Key
특성으로 해당 항목을 식별할 수 있습니다. 리소스 사전에 저장된 항목은 항목에 대한 모든 참조에서 공유됩니다.
범용적인 StaticResource
대부분의 경우 ResourceSharing 샘플에서 보여주듯이 StaticResource
태그 확장을 사용하여 리소스 사전의 항목을 참조합니다. StaticResourceExtension
요소 또는 StaticResource
를 중괄호 안에 사용할 수 있습니다.
x:Static
태그 확장과 StaticResource
태그 확장을 혼동해서는 안 됩니다.
사전 트리
XAML 파서는 StaticResource
가 발견되면 일치하는 키에 대한 시각적 트리 검색을 시작한 다음, 애플리케이션의 App
클래스에서 ResourceDictionary
을 찾습니다. 이렇게 하면 시각적 트리에서 더 하위에 있는 리소스 사전의 항목이 시각적 트리에서 더 상위에 있는 리소스 사전을 재정의할 수 있습니다. 이는 ResourceTrees 샘플에서 보여 줍니다.
특수 목적의 DynamicResource
StaticResource
태그 확장은 InitializeComponent
호출에서 시각적 트리가 빌드될 때 사전에서 항목을 검색합니다. StaticResource
에 대한 대안은 사전 키에 대한 링크를 유지 관리하고 키에서 참조하는 항목이 변경될 때 대상을 업데이트하는 DynamicResource
입니다.
StaticResource
와 DynamicResource
의 차이점은 DynamicVsStatic 샘플에서 설명합니다.
DynamicResource
에 의해 설정된 속성은 11장, 바인딩 가능한 인프라에서 설명된 대로 바인딩 가능한 속성에 의해 지원되어야 합니다.
덜 사용되는 태그 확장
x:Null
태그 확장을 사용하여 속성을 null
로 설정합니다.
x:Type
태그 확장을 사용하여 속성을 .NET Type
개체로 설정합니다.
x:Array
를 사용하여 배열을 정의합니다. [Type
] 속성을 x:Type
태그 확장으로 설정하여 배열 멤버의 형식을 지정합니다.
사용자 지정 태그 확장
ProvideValue
메서드를 사용하여 IMarkupExtension
인터페이스를 구현하는 클래스를 작성하여 자체 XAML 태그 확장을 만들 수 있습니다.
HslColorExtension
클래스는 이러한 요구 사항을 충족합니다. H
, S
, L
및 A
라는 속성의 값을 기반으로 Color
형식의 값을 만듭니다. 이 클래스는 이 책에서 작성하고 사용하는 Xamarin.FormsBook.Toolkit라는 Xamarin.Forms 라이브러리의 첫 번째 항목입니다.
CustomExtensionDemo 샘플에서는 이 라이브러리를 참조하고 사용자 지정 태그 확장을 사용하는 방법을 보여 줍니다.