태그 확장 및 XAML
업데이트: 2007년 11월
이 항목에서는 XAML(Extensible Application Markup Language) 태그 확장의 구문 규칙, 용도, 기반이 되는 개체 모델 등을 비롯한 개념에 대해 소개합니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- XAML 프로세서와 태그 확장
- 기본 태그 확장 구문
- WPF 관련 태그 확장
- XAML 정의 태그 확장
- 태그 확장 구문에 대한 추가 정보
- 관련 항목
XAML 프로세서와 태그 확장
XAML 프로세서는 컴파일 또는 해석을 통해 XAML을 사양에 따라 언어로 적용할 수 있고 XAML 사양에 따라 런타임 개체 모델에 사용할 기본 클래스를 결과로 생성할 수 있는 프로그램입니다. 기본적으로 이와 같은 프로세서는 특성 값을 리터럴 문자열로 해석하거나, 특성 형식이나 특성과 관련된 형식 변환기를 기반으로 특성 값을 개체로 변환합니다. 하지만 이와 다른 동작이 필요한 경우도 있습니다. 예를 들어 특성 값을 이미 생성된 개체나 정적 개체의 참조로 사용하도록 XAML 프로세서에 지시할 수 있습니다. 또는 개체의 생성자에 기본값이 아닌 인수를 제공하는 구문을 사용하도록 XAML 프로세서에 지시할 수 있는데 이것은 기본적으로 지정되는 XAML 동작에서 벗어나는 것입니다.
기본 태그 확장 구문
태그 확장은 특성에서 사용되는 속성, 속성 요소에서 사용되는 속성 또는 두 속성 모두의 값을 제공하도록 구현할 수 있습니다.
특성 값을 제공하는 데 사용되는 경우 XAML 프로세서는 구문에서 여는 중괄호와 닫는 중괄호({ 및 })를 통해 태그 확장을 구분합니다. 태그 확장 형식은 여는 중괄호 바로 다음에 오는 문자열 토큰으로 식별됩니다.
속성 요소 구문에 사용되는 경우 태그 확장은 속성 요소 값을 제공하는 데 사용되는 다른 요소와 시각적으로 동일합니다. 즉, 태그 확장 클래스를 요소로 참조하는 XAML 요소 선언을 꺾쇠괄호(<>)로 묶습니다.
WPF 관련 태그 확장
WPF 프로그래밍에서 사용되는 가장 일반적인 태그 확장은 리소스 참조(StaticResource 및 DynamicResource)를 지원하는 태그 확장과 데이터 바인딩(Binding)을 지원하는 태그 확장입니다.
StaticResource는 이미 정의된 리소스의 값을 대체하여 XAML 속성의 값을 제공합니다. 자세한 내용은 StaticResource 태그 확장을 참조하십시오.
DynamicResource는 값이 리소스에 대한 런타임 참조가 되도록 지연하여 XAML 속성의 값을 제공합니다. 동적 리소스 참조의 경우에는 해당 리소스에 액세스할 때마다 새 조회가 실행됩니다. 자세한 내용은 DynamicResource 태그 확장을 참조하십시오.
Binding은 요소에 적용되는 데이터 컨텍스트에 따라 속성에 대한 데이터 바인딩된 값을 제공합니다. 이 태그 확장은 데이터 바인딩을 지정하는 인라인 구문을 사용하기 때문에 비교적 복잡합니다. 자세한 내용은 Binding 태그 확장을 참조하십시오.
RelativeSource는 런타임 요소 트리에서 가능한 여러 관계를 탐색할 수 있는 Binding에 대한 소스 정보를 제공합니다. 즉, 주변 요소 트리에 대한 완전한 지식 없이 코드에 생성되거나 다용도 템플릿에 생성되는 바인딩에 대한 특수한 소스를 제공합니다. 자세한 내용은 RelativeSource MarkupExtension을 참조하십시오.
TemplateBinding을 사용하면 컨트롤 템플릿에서 템플릿을 사용할 클래스의 개체-모델 정의 속성에서 가져온 템플릿 기반 속성 값을 사용할 수 있습니다. 자세한 내용은 TemplateBinding 태그 확장을 참조하십시오. TemplateBinding의 실질적인 사용 방법에 자세한 내용은 ControlTemplates를 사용한 스타일 지정 샘플을 참조하십시오.
XAML 정의 태그 확장
XAML의 WPF 응용 프로그램과 관련되지 않고 대신 XAML 사양에서 언어로 사용되는 몇 가지 태그 확장도 있습니다. 일반적인 사용 방법에서 볼 수 있는 것처럼 이러한 태그 확장은 대개 구문에서 x: 접두사로 식별됩니다. 이러한 언어 요소의 WPF 구현에서도 동일한 MarkupExtension 기본 클래스를 사용하여 구현을 제공합니다.
참고
x: 접두사는 XAML 응용 프로그램이나 문서의 루트 요소에서 XAML 네임스페이스의 대표적인 XML 네임스페이스 매핑에 사용됩니다. 예를 들어 Microsoft Visual Studio 2005 템플릿은 이 x: 매핑을 사용하여 XAML 파일을 초기화합니다. 사용자 지정 XML 네임스페이스 매핑에는 다른 접두사 토큰을 선택할 수 있지만 이 설명서에서는 WPF 네임스페이스나 기타 임의 CLR 또는 XML 네임스페이스와는 달리 XAML 네임스페이스의 일부로 정의된 엔터티를 식별하는 데 기본 x: 매핑을 사용합니다.
x:Type은 명명된 형식에 대한 Type 개체를 제공합니다. 이 태그 확장은 스타일 및 템플릿에서 가장 많이 사용됩니다. 자세한 내용은 x:Type 태그 확장을 참조하십시오.
x:Static은 속성 값의 형식은 아니지만 해당 형식으로 확인될 수 있는 값 형식 코드 엔터티에서 정적 값을 생성합니다. 자세한 내용은 x:Static 태그 확장을 참조하십시오.
x:Null은 null을 XAML 속성의 값으로 지정합니다. 자세한 내용은 x:Null 태그 확장을 참조하십시오.
x:Array를 사용하면 기본 요소 및 컨트롤 모델에서 제공하는 컬렉션 지원 기능을 의도적으로 사용하지 않는 경우에 XAML 구문에서 일반적인 배열을 생성할 수 있습니다. 자세한 내용은 x:Array 태그 확장을 참조하십시오.
태그 확장 구문에 대한 추가 정보
*Extension 클래스
XAML 프로세서에서 각 태그 확장의 동작은 MarkupExtension에서 파생되고 ProvideValue 메서드 구현을 제공하는 *Extension 클래스를 통해 식별됩니다. 각 확장에서 이 메서드는 태그 확장이 실행된 후 반환되는 개체를 정의합니다. 반환되는 개체는 대개 태그 확장에 전달된 다양한 문자열 토큰을 사용하여 인스턴화되거나 설정됩니다.
예를 들어 StaticResourceExtension 클래스는 해당 ProvideValue 구현이 요청된 개체를 반환하도록 실제 리소스 조회의 표면적인 구현을 제공합니다. 이때 이 구현의 입력은 x:Key를 기준으로 리소스를 조회하는 데 사용되는 문자열입니다. 기존 태그 확장을 사용할 때에는 이러한 구현 세부 사항이 중요하지 않습니다.
후속 문자열 토큰의 확장 클래스 해석
XAML 프로세서는 중괄호 안에서 태그 확장 식별자 다음에 나오는 문자열 토큰을 다음 방법 중 하나로 해석합니다.
쉼표는 항상 개별 토큰의 분리 기호나 구분 기호를 나타냅니다. 따라서 리터럴 쉼표는 태그 확장에 전달할 수 없습니다.
구분된 개별 토큰에 등호가 포함되지 않은 경우 각 토큰은 생성자 인수로 처리됩니다. 각 생성자 매개 변수는 해당 시그니처에 필요한 형식과 순서로 지정되어야 합니다.
참고
XAML 프로세서는 여러 쌍 중 인수 수가 일치하는 생성자를 호출해야 합니다. 따라서 사용자 지정 태그 확장을 구현하는 경우 인수 수가 같은 매개 변수가 중복되면 안 됩니다. 매개 변수 수가 동일한 태그 확장 생성자가 둘 이상 있는 경우 발생하는 동작은 정의되어 있지 않습니다.
구분된 개별 토큰에 등호가 있으면 XAML 프로세서는 먼저 태그 확장의 기본 생성자를 호출합니다. 그런 다음 각 이름=값 쌍이 태그 확장에 존재하는 속성 이름과 해당 속성에 할당할 값으로 해석됩니다.
태그 확장에서 생성자 동작과 속성 설정 동작이 동일한 경우에는 어떤 동작을 사용해도 관계가 없습니다. 설정 가능한 속성이 둘 이상 있는 태그 확장에서는 속성=값 쌍을 사용하는 것이 보다 일반적입니다. 그 이유는 태그의 의도를 더욱 명확하게 지정할 수 있고, 속성=값 쌍을 지정할 경우 속성 순서가 중요하지 않으므로 실수로 생성자 매개 변수 순서가 바뀌는 일을 방지할 수 있기 때문입니다. 또한 태그 확장이 설정 가능한 속성을 모두 설정하는 생성자 매개 변수를 제공한다는 보장이 없습니다. 예를 들어 Binding은 확장에서 속성=값 형태로 설정할 수 있는 많은 속성이 있는 태그 확장이지만 Binding은 두 가지 생성자, 즉 기본 생성자와 초기 경로를 설정하는 생성자만 지원합니다.
리터럴 중괄호 문자 이스케이프
XAML 프로세서의 특성 처리에서는 중괄호를 태그 확장 표시기로 사용합니다. 또한 필요한 경우에는 리터럴 중괄호 다음에 비어 있는 중괄호 쌍을 사용하여 이스케이프 시퀀스를 입력함으로써 리터럴 중괄호 문자 특성을 생성할 수 있습니다. 자세한 내용은 {} 이스케이프 시퀀스 / 태그 확장을 참조하십시오.
확장 구문 중첩
다음 예에서 볼 수 있는 것처럼, 여러 태그 확장을 중첩할 수 있으며 각 태그 확장은 가장 깊은 수준부터 사용됩니다.
<Setter Property="Background"
Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
태그 확장 및 속성 요소 구문에 대한 추가 정보
속성 요소 값을 채우는 개체 요소로 사용된 경우에는 태그 확장 클래스를 XAML에서 사용할 수 있는 일반 요소와 시각적으로 구분할 수 없습니다. 이 경우 일반 요소와 태그 확장 간의 실질적인 차이는 태그 확장이 형식화된 값으로 계산되거나 식으로 지연되기 때문에 다른 프로그래밍 모델에서 런타임에 바인딩되는 속성이 처리되는 방식과 마찬가지로 속성 값에서 발생할 수 있는 형식 오류에 대한 메커니즘이 다르다는 것입니다. 일반 요소는 컴파일 즉시 설정되는 속성과 형식에 대해 계산됩니다.
속성 요소를 채우는 개체 요소 구문에 사용되는 대부분의 태그 확장에는 콘텐츠나 추가 속성 요소 구문이 없으므로 개체 요소 태그를 닫고 자식 요소를 제공하지 않을 수 있습니다. XAML 프로세서에서 개체 요소를 발견할 때마다 해당 클래스의 생성자가 호출되어 구문 분석된 요소에서 생성되는 개체를 인스턴스화합니다. 태그 확장 클래스의 경우에도 마찬가지입니다. 따라서 개체 요소 구문에서 태그 확장을 사용할 수 있으려면 기본 생성자를 제공해야 합니다. 일부 기존 태그 확장에는 효율적인 초기화를 위해 지정해야 하는 필수 속성 값이 적어도 하나는 있습니다. 이런 경우 해당 속성 값은 대개 개체 요소에 속성 특성으로 지정됩니다. XAML 네임스페이스(x:) 언어 기능 및 WPF 네임스페이스 XAML 확장 참조 페이지에는 필수 속성이 있는 태그 확장 및 필수 속성의 이름이 나와 있습니다. 또한 참조 페이지에는 특정 태그 확장에서 개체 요소 구문이나 특성 구문을 사용할 수 없는지 여부도 나와 있습니다. 예를 들어 x:Array 태그 확장의 경우에는 배열의 내용을 지정해야 하기 때문에 특성 구문을 사용할 수 없습니다. 배열 내용은 일반 개체로 처리되므로 특성에 대한 기본 형식 변환기를 사용할 수 없습니다. x:Array 태그 확장에는 Type 매개 변수도 필요합니다.