다음을 통해 공유


XAML 태그 확장 개요

태그 확장은 기본 형식이나 특정 XAML 형식이 아닌 값을 얻기 위한 XAML 기술입니다. 특성 사용의 경우 태그 확장은 여는 중괄호 {의 알려진 문자 시퀀스를 사용하여 태그 확장 범위를 입력하고 닫는 중괄호 }를 사용하여 종료합니다. .NET Framework XAML 서비스를 사용할 때 System.Xaml 어셈블리에서 미리 정의된 XAML 언어 태그 확장의 일부를 사용할 수 있습니다. 또한 System.Xaml에 정의된 MarkupExtension 클래스에서 서브클래싱하고 고유한 태그 확장을 정의할 수 있습니다. 또는 특정 프레임워크를 이미 참조하는 중이면 해당 프레임워크에 의해 정의된 태그 확장을 사용할 수 있습니다.

태그 확장 사용에 액세스할 경우 XAML 개체 작성기는 MarkupExtension.ProvideValue 재정의에서 서비스 연결 지점을 통해 사용자 지정 MarkupExtension 클래스에 서비스를 제공할 수 있습니다. 서비스를 사용하여 사용, 개체 작성기의 특정 기능, XAML 스키마 컨텍스트 등에 대한 컨텍스트를 얻을 수 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • XAML 정의 태그 확장
  • MarkupExtension 기본 클래스
  • 사용자 지정 태그 확장에 대한 지원 형식 정의
  • 사용자 지정 태그 확장에 대한 생성자 패턴 및 위치 인수
  • 사용자 지정 태그 확장에 대한 명명된 인수
  • 태그 확장 구현에서 서비스 공급자 컨텍스트에 액세스
  • 태그 확장의 속성 요소 사용
  • 사용자 지정 태그 확장에 대한 특성 설정
  • 태그 확장 사용의 Serialization
  • XAML 노드 스트림의 태그 확장
  • 관련 항목

XAML 정의 태그 확장

여러 태그 확장이 XAML 언어 지원을 위해 .NET Framework XAML 서비스에 의해 구현됩니다. 이러한 태그 확장은 하나의 언어로 XAML의 사양 중 일부에 해당합니다. 일반적인 사용 방법에서 볼 수 있는 것처럼 이러한 태그 확장은 대개 구문에서 x: 접두사로 식별됩니다. 이러한 XAML 언어 요소에 대한 .NET Framework XAML 서비스 구현은 모두 MarkupExtension 기본 클래스에서 파생됩니다.

참고참고

x: 접두사는 XAML 프로덕션의 루트 요소에서 XAML 언어 네임스페이스의 대표적인 XAML 네임스페이스 매핑에 사용됩니다.예를 들어 다양한 특정 프레임워크에 대한 Visual Studio 프로젝트 및 페이지 템플릿은 이 x: 매핑을 사용하여 XAML 파일을 시작합니다.사용자 지정 XAML 네임스페이스 매핑에는 다른 접두사 토큰을 선택할 수 있지만 이 설명서에서는 특정 프레임워크의 기본 XAML 네임스페이스나 기타 임의의 CLR 또는 XML 네임스페이스와 구별하여 XAML 언어 XAML 네임스페이스의 일부로 정의된 엔터티를 식별하기 위해 기본 x: 매핑을 사용합니다.

x:Type

x:Type은 명명된 형식에 대한 Type 개체를 제공합니다. 이 기능은 기본 CLR 형식 및 형식 파생을 그룹화 모니커 또는 식별자로 사용하는 지연 메커니즘에서 가장 자주 사용됩니다. WPF 스타일 및 템플릿과 TargetType 속성의 사용이 구체적 예입니다. 자세한 내용은 x:Type 태그 확장을 참조하십시오.

x:Static

x:Static은 속성 값의 형식은 아니지만 해당 형식으로 확인될 수 있는 값 형식 코드 엔터티에서 정적 값을 생성합니다. 이는 형식 정의에서 잘 알려진 상수로 이미 존재하는 값을 지정하는 데 유용합니다. 자세한 내용은 x:Static 태그 확장을 참조하십시오.

x:Null

x:Null은 null을 XAML 멤버의 값으로 지정합니다. 특정 형식의 디자인이나 더 큰 프레임워크 개념에 따라 null이 속성의 기본값이나 빈 문자열 특성의 암시적 값이 아닐 수도 있습니다. 자세한 내용은 x:Null 태그 확장을 참조하십시오.

x:Array

x:Array를 사용하면 기본 요소 및 컨트롤 모델에서 제공하는 컬렉션 지원 기능을 의도적으로 사용하지 않는 경우에 XAML 구문에서 일반적인 배열을 생성할 수 있습니다. 자세한 내용은 x:Array 태그 확장을 참조하십시오. 특히 XAML 2009의 경우 배열은 확장이 아니라 언어 기본 형식으로 액세스됩니다. 자세한 내용은 XAML 2009 언어 기능을 참조하십시오.

x:Reference

x:Reference는 원래(2006) 언어 집합의 확장인 XAML 2009의 일부입니다. x:Reference는 개체 그래프의 다른 기존 개체에 대한 참조를 나타냅니다. 해당 개체는 해당 x:Name으로 식별됩니다. 자세한 내용은 x:Reference 태그 확장을 참조하십시오.

기타 x: 구문

XAML 언어 기능을 지원하기 위한 기타 x: 구문이 있지만 이러한 구문은 태그 확장으로 구현되지 않습니다. 자세한 내용은 XAML 네임스페이스(x:) 언어 기능을 참조하십시오.

MarkupExtension 기본 클래스

System.Xaml에서 XAML 판독기 및 XAML 작성기의 기본 구현과 상호 작용할 수 있는 사용자 지정 태그 확장을 정의하려면 추상 MarkupExtension 클래스에서 클래스를 파생시킵니다. 해당 클래스에는 재정의해야 할 메서드 하나(ProvideValue)가 있습니다. 또한 태그 확장 사용에 대한 인수 및 일치하는 설정 가능 속성을 지원하기 위해 추가 생성자를 정의해야 할 수 있습니다.

ProvideValue를 통해 사용자 지정 태그 확장은 XAML 프로세서에 의해 태그 확장이 실제로 호출되는 환경을 보고하는 서비스 컨텍스트에 액세스할 수 있습니다. 로드 경로에서 이는 일반적으로 XamlObjectWriter입니다. 저장 경로에서는 일반적으로 XamlXmlWriter입니다. 각각은 서비스 공급자 패턴을 구현하는 내부 XAML 서비스 공급자 컨텍스트 클래스로 서비스 컨텍스트를 보고합니다. 사용할 수 있는 서비스 및 이러한 서비스가 나타내는 항목에 대한 자세한 내용은 XAML을 위한 형식 변환기 및 태그 확장을 참조하십시오.

태그 확장 클래스는 공용 액세스 수준을 사용해야 합니다. 즉, XAML 프로세서는 해당 서비스를 사용하기 위해 항상 태그 확장의 지원 클래스를 인스턴스화할 수 있어야 합니다.

사용자 지정 태그 확장에 대한 지원 형식 정의

.NET Framework XAML 서비스를 사용하거나 .NET Framework XAML 서비스를 기반으로 빌드된 프레임워크를 사용할 때 두 가지 방법으로 태그 확장 지원 형식의 이름을 지정할 수 있습니다. 형식 이름은 XAML 개체 작성기가 XAML에서 태그 확장 사용을 발견할 때 지원하는 태그 확장 지원 형식에 액세스 및 호출하는 방법과 관련이 있습니다. 다음 명명 전략 중 하나를 사용합니다.

  • XAML 태그 사용 토큰에 정확하게 일치하도록 형식 이름을 지정합니다. 예를 들어 {Collate ...} 확장 사용을 지원하려면 지원 형식의 이름을 Collate로 지정합니다.

  • 접미사 Extension을 포함하여 사용 문자열 토큰이 되도록 형식 이름을 지정합니다. 예를 들어 {Collate ...} 확장 사용을 지원하려면 지원 형식의 이름을 CollateExtension으로 지정합니다.

조회 순서에 따라 Extension 접미사가 있는 클래스 이름을 먼저 찾은 다음 Extension 접미사가 없는 클래스 이름을 찾습니다.

태그 사용 관점에서 Extension 접미사를 태그 사용의 일부로 포함하는 것이 올바릅니다. 그러나 이 경우 Extension이 실제로 클래스 이름의 일부인 것처럼 동작하며, XAML 개체 작성기는 태그 확장 지원 클래스에 Extension 접미사가 없는 경우 해당 사용에 대한 지원 클래스를 확인하지 못합니다.

기본 생성자

모든 태그 확장 지원 형식의 경우 공용 기본 생성자를 노출해야 합니다. 기본 생성자는 XAML 개체 작성기가 개체 요소 사용에서 태그 확장을 인스턴스화하는 경우에 필요합니다. 개체 요소 사용을 지원하는 것은 특히 serialization을 위한 태그 확장에 필요합니다. 그러나 태그 확장의 특성 사용만 지원하려는 경우 공용 생성자 없이 태그 확장을 구현할 수 있습니다.

태그 확장 사용에 인수가 없는 경우 사용을 지원하기 위해 기본 생성자가 필요합니다.

사용자 지정 태그 확장에 대한 생성자 패턴 및 위치 인수

원하는 인수 사용을 포함한 태그 확장의 경우 공용 생성자는 해당 사용의 모드와 일치해야 합니다. 즉, 태그 확장이 유효한 사용으로 하나의 위치 인수를 필요로 하도록 설계된 경우 위치 인수를 가지는 하나의 입력 매개 변수가 있는 공용 생성자를 지원해야 합니다.

예를 들어 Collate 태그 확장이 CollationMode 열거형 상수로 지정된 모드를 나타내는 하나의 위치 매개 변수가 존재하는 모드만 지원하도록 되어 있다고 가정해 보겠습니다. 이 경우 다음 형태를 가진 생성자가 있어야 합니다.

public Collate(CollationMode collationMode) {...}

기본 수준에서 태그 확장에 전달된 인수는 태그의 특성 값에서 전달되는 중이므로 문자열입니다. 모든 인수를 문자열로 만들고 해당 수준에서 입력 작업을 수행할 수 있습니다. 그러나 태그 확장 인수가 지원 클래스에 전달되기 전에 발생하는 특정 처리에 액세스할 수 있습니다.

태그 확장이 작성될 개체인 것처럼 개념적으로 처리가 수행된 다음 해당 멤버 값이 설정됩니다. 설정하도록 지정된 각 속성은 XML이 구문 분석될 때 지정된 멤버가 작성된 개체에서 설정될 수 있는 방법과 비슷하게 평가됩니다. 하지만 중요한 두 가지 차이점이 있습니다.

  • 앞에서 언급한 것처럼 태그 확장 지원 형식은 XAML에서 인스턴스화하기 위해 기본 생성자를 가질 필요가 없습니다. 텍스트 구문에 있는 가능한 인수가 위치 또는 명명된 인수로 토큰화 및 평가되고 적절한 생성자가 해당 시점에 호출될 때까지 개체 생성은 지연됩니다.

  • 태그 확장 사용은 중첩될 수 있습니다. 가장 안쪽의 태그 확장이 먼저 평가됩니다. 따라서 이러한 사용을 가정하고 생성할 태그 확장과 같은 값 변환기를 필요로 하는 형식으로 생성 매개 변수 중 하나를 선언할 수 있습니다.

이러한 처리에 의존하는 경우가 앞의 예제에 나와 있습니다. .NET Framework XAML 서비스 XAML 개체 작성기는 네이티브 수준에서 열거된 값으로 열거형 상수 이름을 처리합니다.

또한 태그 확장 위치 매개 변수의 텍스트 구문 처리는 생성 인수의 형식과 연결된 형식 변환기에 의존할 수 있습니다.

사용에서 토큰이 발생하는 순서가 이러한 토큰이 할당된 생성자 매개 변수의 위치 순서에 해당하므로 인수를 위치 인수라고 합니다. 예를 들어 다음의 생성자 시그니처를 참조하십시오.

public Collate(CollationMode collationMode, object collateThis) {...}

XAML 프로세서에는 이 태그 확장에 대한 두 개의 위치 인수가 필요합니다. {Collate AlphaUp,{x:Reference circularFile}} 사용이 있는 경우 AlphaUp 토큰은 첫 번째 매개 변수에 보내지고 CollationMode 열거형으로 명명된 상수로 평가됩니다. 내부 x:Reference의 결과는 두 번째 매개 변수에 보내지고 개체로 평가됩니다.

태그 확장 구문 및 처리에 대한 XAML 지정 규칙에서는 인수가 위치 인수인지 아니면 명명된 인수인지 여부에 상관없이 쉼표가 인수 간의 구분 기호로 사용됩니다.

위치 인수의 중복 인자 수

XAML 개체 작성기가 위치 인수가 포함된 태그 확장 사용을 발견할 때 해당 수의 인수를 사용하는 여러 생성자 인수가 있는 경우(중복 인자 수) 이것이 반드시 오류는 아닙니다. 이 동작은 사용자 지정 가능한 XAML 스키마 컨텍스트 설정인 SupportMarkupExtensionsWithDuplicateArity에 따라 달라집니다. SupportMarkupExtensionsWithDuplicateArity가 true이면 XAML 개체 작성기가 중복 인자 수라는 이유로는 예외를 throw하지 않아야 합니다. 이를 벗어나는 동작은 엄격하게 정의되어 있지 않습니다. 기본 디자인 가정은 스키마 컨텍스트에서 특정 매개 변수에 사용할 수 있는 형식 정보가 있으며 가장 일치하는 시그니처를 확인하기 위해 중복 후보 항목을 일치시키는 명시적 캐스팅을 시도할 수 있다는 것입니다. XAML 개체 작성기에서 실행되는 해당 특정 스키마 컨텍스트에서 적용된 테스트를 통과할 수 있는 시그니처가 없는 경우 예외가 여전히 throw될 수 있습니다.

기본적으로 SupportMarkupExtensionsWithDuplicateArity는 .NET Framework XAML 서비스의 CLR 기반 XamlSchemaContext에서 false입니다. 따라서 기본 XamlObjectWriter는 지원 형식의 생성자에 중복 인자 수가 있는 태그 확장 사용을 발견하는 경우 예외를 throw합니다.

사용자 지정 태그 확장에 대한 명명된 인수

XAML에 의해 지정된 태그 확장은 명명된 인수 형태를 사용에 적용할 수도 있습니다. 토큰화의 첫 번째 수준에서 텍스트 구문은 인수로 구분됩니다. 임의의 인수 내에 있는 등호(=)는 해당 인수를 명명된 인수로 식별합니다. 또한 이러한 인수는 이름/값 쌍으로 토큰화됩니다. 이 경우 이름은 태그 확장의 지원 형식에 대한 공용으로 설정 가능한 속성의 이름을 지정합니다. 명명된 인수 사용을 지원하려면 이러한 공용으로 설정 가능한 속성을 제공해야 합니다. 속성은 공용으로 유지되는 동안 상속된 속성일 수 있습니다.

태그 확장 구현에서 서비스 공급자 컨텍스트에 액세스

사용 가능한 서비스는 모든 값 변환기에 대해 동일합니다. 각 값 변환기가 서비스 컨텍스트를 수신하는 방법에는 차이가 있습니다. 서비스 액세스 방법 및 사용 가능한 서비스는 XAML을 위한 형식 변환기 및 태그 확장 항목에 설명되어 있습니다.

태그 확장의 속성 요소 사용

태그 확장 사용의 시나리오는 흔히 특성 사용에서 태그 확장을 사용하는 것을 중심으로 디자인됩니다. 그러나 속성 요소 사용을 지원하기 위해 지원 클래스를 정의할 수도 있습니다.

태그 확장의 속성 요소 사용을 지원하려면 public 기본 생성자를 정의합니다. 이 생성자는 정적 생성자가 아니라 인스턴스 생성자여야 합니다. 이는 일반적으로 XAML 프로세서가 태그에서 처리하는 모든 개체 요소에서 기본 생성자를 호출해야 하며 여기에는 태그 확장 클래스가 개체 요소로 포함되기 때문에 필요합니다. 고급 시나리오의 경우 클래스에 대해 기본값이 아닌 생성 경로를 정의할 수 있습니다. 자세한 내용은 x:FactoryMethod 지시문을 참조하십시오. 그러나 태그 확장 목적을 위해 이러한 패턴을 사용하면 안 됩니다. 이렇게 하면 원시 태그의 사용자와 디자이너가 사용 패턴을 검색하기가 훨씬 더 어렵기 때문입니다.

사용자 지정 태그 확장에 대한 특성 설정

디자인 환경과 특정 XAML 개체 작성기 시나리오를 모두 지원하기 위해 몇 가지 CLR 특성을 사용하여 태그 확장 지원 클래스 형식에 특성을 설정해야 합니다. 이러한 특성은 원하는 태그 확장 사용을 보고합니다.

MarkupExtensionReturnTypeAttributeProvideValue가 반환하는 개체 형식에 대한 Type 정보를 보고합니다. 순수 시그니처에 따라 ProvideValueObject를 반환합니다. 그러나 다양한 소비자가 더욱 자세한 반환 형식 정보를 원할 수도 있습니다. 이러한 정보는 다음과 같습니다.

  • 태그 확장 사용에 대한 형식 인식 지원을 제공할 수 있는 디자이너와 IDE

  • 이름을 기준으로 알려진 특정 MarkupExtension 구현에서 분기하는 대신 태그 확장의 반환 형식을 결정하기 위해 리플렉션을 사용할 수 있는 대상 클래스에 대한 SetMarkupExtension 처리기의 고급 구현

태그 확장 사용의 Serialization

XAML 개체 작성기가 태그 확장 사용을 처리하고 ProvideValue를 호출할 경우 태그 확장 사용이 되고 나서 이에 대한 컨텍스트는 XAML 노드 스트림에서 유지되지만 개체 그래프에서는 유지되지 않습니다. 개체 그래프에서는 값만 유지됩니다. 원래의 태그 확장 사용을 serialize된 출력에서 유지해야 할 설계 시나리오 또는 기타 이유가 있는 경우 로드 경로 XAML 노드 스트림에서 태그 확장 사용을 추적하기 위한 고유한 인프라를 설계해야 합니다. 로드 경로에서 노드 스트림의 요소를 다시 만들어 저장 경로에서의 serialization을 위해 XAML 작성기에서 다시 재생하는 동작을 구현하여 노드 스트림의 해당 위치에 있는 값을 대체할 수 있습니다.

XAML 노드 스트림의 태그 확장

로드 경로에서 XAML 노드 스트림을 사용하여 작업하는 경우 태그 확장 사용은 노드 스트림에 개체로 나타납니다.

태그 확장 사용에서 위치 인수를 사용하면 태그 확장 사용이 초기화 값을 가진 시작 개체로 표현됩니다 대략적인 텍스트 표현으로 나타낸 노드 스트림은 다음과 유사합니다.

StartObject(XamlType은 태그 확장의 반환 형식이 아니라 정의 형식임)

  StartMember(XamlMember의 이름이 _InitializationText임)

    Value(값이 사이의 구분 기호를 포함하는 문자열로 된 위치 인수임)

  EndMember

EndObject

명명된 인수가 포함된 태그 확장 사용은 각각 텍스트 문자열 값으로 설정된 관련 이름의 멤버가 있는 개체로 표현됩니다.

태그 확장의 ProvideValue 구현을 실제로 호출하려면 태그 확장 지원 형식 인스턴스를 만들고 형식을 매핑해야 하기 때문에 XAML 스키마 컨텍스트가 필요합니다. 이러한 이유로 태그 확장 사용은 기본 .NET Framework XAML 서비스 노드 스트림에 이 방식으로 유지됩니다. 따라서 로드 경로의 판독기 부분에서 필요한 XAML 스키마 컨텍스트를 사용할 수 없는 경우가 있습니다.

저장 경로에서 XAML 노드 스트림을 사용하여 작업하는 경우 일반적으로 개체 그래프 표현에는 serialize할 개체가 원래 태그 확장 사용 및 ProvideValue 결과에서 제공된 것임을 알려 줄 수 있는 항목이 표시되지 않습니다. 개체 그래프의 다른 변경 내용을 캡처하는 동안 라운드트립에 대한 태그 확장 사용을 유지해야 하는 시나리오에서는 원래 XAML 입력에서 태그 확장 사용에 대한 정보를 유지하기 위한 방법을 직접 고안해야 합니다. 예를 들어 태그 확장 사용을 복원하려면 태그 확장 사용을 복원하기 위해 저장 경로에서 노드 스트림을 사용하여 작업하거나 원래 XAML과 라운드트립된 XAML 간 일종의 병합을 수행해야 할 수 있습니다. WPF와 같은 일부 XAML 구현 프레임워크에서는 중간 형식(식)을 사용하여 태그 확장 사용에서 값을 제공한 경우를 나타냅니다.

참고 항목

참조

MarkupExtension

개념

태그 확장 및 WPF XAML

기타 리소스

XAML을 위한 형식 변환기 및 태그 확장