XAML에 대 한 태그 확장 개요Overview of markup extensions for XAML

태그 확장은 기본 형식이 나 특정 XAML 형식이 아닌 값을 가져오기 위한 XAML 기술입니다.Markup extensions are a XAML technique for obtaining a value that's not a primitive or a specific XAML type. 특성 사용과 관련하여 태그 확장은 여는 중괄호 { 의 알려진 문자 시퀀스를 사용하여 태그 확장 범위를 시작하고 닫는 중괄호 } 를 사용하여 종료합니다.For attribute usage, markup extensions use the known character sequence of an opening curly brace { to enter the markup extension scope, and a closing curly brace } to exit. .NET XAML 서비스를 사용 하는 경우 system.xaml 어셈블리에서 미리 정의 된 몇 가지 XAML 언어 태그 확장을 사용할 수 있습니다.When using .NET XAML Services, you can use some of the predefined XAML language markup extensions from the System.Xaml assembly. System.Xaml에 정의된 MarkupExtension 클래스에서 서브클래싱하고 고유한 태그 확장을 정의할 수도 있습니다.You can also subclass from the MarkupExtension class, defined in System.Xaml, and define your own markup extensions. 또는 해당 프레임 워크를 이미 참조 하 고 있는 경우 특정 프레임 워크에 의해 정의 된 태그 확장을 사용할 수 있습니다.Or you can use markup extensions defined by a particular framework if you are already referencing that framework.

태그 확장 사용법에 액세스하는 경우 XAML 개체 작성기는 MarkupExtension 재정의의 서비스 연결 지점을 통해 사용자 지정 MarkupExtension.ProvideValue 클래스에 서비스를 제공할 수 있습니다.When a markup extension usage is accessed, the XAML object writer can provide services to a custom MarkupExtension class through a service connection point in the MarkupExtension.ProvideValue override. 이 서비스는 사용법, 개체 작성기의 특정 기능, XAML 스키마 컨텍스트 등에 대한 컨텍스트를 가져오는 데 사용할 수 있습니다.The services can be used to obtain context about the usage, specific capabilities of the object writer, XAML schema context, and so on.

XAML 정의 태그 확장XAML-defined markup extensions

몇 가지 태그 확장은 XAML 언어 지원을 위해 .NET XAML 서비스에 의해 구현 됩니다.Several markup extensions are implemented by .NET XAML Services for XAML language support. 이러한 태그 확장은 XAML 언어 사양의 일부에 해당합니다.These markup extensions correspond to parts of the specification of XAML as a language. 일반적인 사용법을 통해 알 수 있듯이 이러한 확장은 구문에서 x: 접두사로 식별할 수 있습니다.These are typically identifiable by the x: prefix in the syntax as seen in common usage. 이러한 XAML 언어 요소에 대 한 .NET XAML 서비스 구현은 모두 MarkupExtension 기본 클래스에서 파생 됩니다..NET XAML Services implementations for these XAML language elements all derive from the MarkupExtension base class.

참고

x: 접두사는 XAML 프로덕션의 루트 요소에서 XAML 언어 네임스페이스의 일반적인 XAML 네임스페이스 매핑에 사용됩니다.The x: prefix is used for the typical XAML namespace mapping of the XAML language namespace, in the root element of a XAML production. 예를 들어 다양 한 특정 프레임 워크에 대 한 Visual Studio 프로젝트 및 페이지 템플릿은이 매핑을 사용 하 여 XAML 파일을 시작 합니다 x: .For example, the Visual Studio project and page templates for various specific frameworks initiate a XAML file using this x: mapping. 사용자 고유의 XAML 네임스페이스 매핑에서 다른 접두사 토큰을 선택할 수 있지만 이 설명서에서는 특정 프레임워크의 기본 XAML 네임스페이스나 다른 임의 CLR 또는 XML 네임스페이스와 달리 XAML 언어 XAML 네임 스페이스에서 정의된 부분인 해당 엔터티를 식별하는 방법으로 기본 x: 매핑을 가정합니다.You could choose a different prefix token in your own XAML namespace mapping, but this documentation will assume the default x: mapping as a means of identifying those entities that are a defined part of the XAML language XAML namespace, as opposed to a specific framework's default XAML namespace or other arbitrary CLR or XML namespaces.

x:Typex:Type

x:Type 은 명명된 형식에 Type 개체를 제공합니다.x:Type supplies the Type object for the named type. 이 기능은 기본 CLR 형식 및 형식 파생을 그룹화 모니커 또는 식별자로 사용하는 지연 메커니즘에서 가장 자주 사용됩니다.This functionality is used most frequently in deferral mechanisms that use underlying CLR type and type derivation as a grouping moniker or identifier. WPF 스타일 및 템플릿, TargetType 속성의 용도는 특정 예제입니다.WPF styles and templates, and their usage of TargetType properties, are a specific example. 자세한 내용은 x:Type Markup Extension을 참조하세요.For more information, see x:Type Markup Extension.

x:Staticx:Static

x:Static 은 직접적으로 속성 값의 형식이 아니라 해당 형식으로 계산될 수 있는 값-형식 코드 엔터티에서 정적 값을 생성합니다.x:Static produces static values from value-type code entities that are not directly the type of a property's value, but can be evaluated to that type. 잘 알려진 상수로 형식 정의에 이미 존재하는 값을 지정하는 데 유용합니다.This is useful for specifying values that already exist as well-known constants in a type definition. 자세한 내용은 x:Static Markup Extension을 참조하세요.For more information, see x:Static Markup Extension.

x:Nullx:Null

x:Nullnull 을 XAML 멤버에 대한 값으로 지정합니다.x:Null specifies null as a value for a XAML member. 특정 형식의 디자인인지 더 큰 프레임워크 개념인지에 따라 null 이 속성의 기본값이나 빈 문자열 특성의 암시적 값이 아닌 경우가 있습니다.Depending on the design of specific types or on larger framework concepts, null is not always a default value for a property, or the implied value of an empty string attribute. 자세한 내용은 x:Null Markup Extension을 참조하세요.For more information, see x:Null Markup Extension.

x:Arrayx:Array

x:Array 는 기본 요소 및 컨트롤 모델에서 제공하는 컬렉션 지원이 의도적으로 사용되지 않는 경우 XAML 구문에서 일반적인 배열 만들기를 지원합니다.x:Array supports creation of general arrays in XAML syntax in cases where the collection support that is provided by base elements and control models is deliberately not used. 자세한 내용은 x:Array Markup Extension을 참조하세요.For more information, see x:Array Markup Extension. 특히 XAML 2009에서 배열은 확장이 아닌 언어 기본 형식으로 액세스됩니다.In XAML 2009 specifically, arrays are accessed as language primitives instead of as an extension. 자세한 내용은 XAML 2009 Language Features을 참조하세요.For more information, see XAML 2009 Language Features.

x:Referencex:Reference

x:Reference 는 원래(2006) 언어 집합의 확장인 XAML 2009의 일부입니다.x:Reference is part of XAML 2009, an extension of the original (2006) language set. x:Reference 는 개체 그래프에 있는 다른 기존 개체에 대한 참조를 나타냅니다.x:Reference represents a reference to another existing object in an object graph. 해당 개체는 x:Name으로 식별됩니다.That object is identified by its x:Name. 자세한 내용은 x:Reference Markup Extension을 참조하세요.For more information, see x:Reference Markup Extension.

기타 x: 구문Other x: Constructs

XAML 언어 기능을 지원하는 다른 x: 구문도 있지만 이러한 구문은 태그 확장으로 구현되지 않습니다.Other x: constructs to support XAML language features exist, but these are not implemented as markup extensions. 자세한 내용은 XAML 네임스페이스(x:) 언어 기능을 참조하세요.For more information, see XAML Namespace (x:) Language Features.

MarkupExtension 기본 클래스The MarkupExtension Base Class

System.Xaml의 XAML 판독기 및 XAML 작성기 기본 구현과 상호 작용할 수 있는 사용자 지정 태그 확장을 정의하려면 추상 MarkupExtension 클래스에서 클래스를 파생시킵니다.To define a custom markup extension that can interact with the default implementations of XAML readers and XAML writers in System.Xaml, you derive a class from the abstract MarkupExtension class. 해당 클래스에는 재정의할 ProvideValue메서드가 한 개 있습니다.That class has one method to override, which is ProvideValue. 태그 확장 사용에 대한 인수 및 일치하는 설정 가능한 속성을 지원하기 위해 추가 생성자도 정의해야 합니다.You might also need to define additional constructors to support arguments to the markup extension usage, and matching settable properties.

ProvideValue를 통해 사용자 지정 태그 확장은 태그 확장이 XAML 프로세서에 의해 호출 되는 환경을 보고 하는 서비스 컨텍스트에 액세스할 수 있습니다.Through ProvideValue, a custom markup extension has access to a service context that reports the environment where the markup extension is invoked by a XAML processor. 로드 경로에서는 일반적으로 XamlObjectWriter 입니다.In the load path, this is typically a XamlObjectWriter. 저장 경로에서는 일반적으로 XamlXmlWriter입니다.In the save path this is typically a XamlXmlWriter. 각각은 서비스 공급자 패턴을 구현하는 내부 XAML 서비스 공급자 컨텍스트 클래스로 서비스 컨텍스트를 보고합니다.Each report the service context as an internal XAML service provider context class that implements a service provider pattern. 사용 가능한 서비스 및 해당 서비스가 나타내는 의미에 대한 자세한 내용은 Type Converters and Markup Extensions for XAML을 참조하세요.For more information about the available services and what they represent, see Type Converters and Markup Extensions for XAML.

태그 확장 클래스는 공용 액세스 수준을 사용해야 합니다. XAML 프로세서는 해당 서비스를 사용하기 위해 태그 확장의 지원 클래스를 항상 인스턴스화할 수 있어야 합니다.Your markup extension class must use a public access level; XAML processors must always be able to instantiate the markup extension's support class in order to use its services.

사용자 지정 태그 확장에 대한 지원 형식 정의Defining the Support Type for a Custom Markup Extension

.Net xaml 서비스 또는 .NET xaml 서비스에서 빌드하는 프레임 워크를 사용 하는 경우 태그 확장 지원 형식의 이름을 표시 하는 방법에 대 한 두 가지 선택 사항이 있습니다.When you use .NET XAML Services or frameworks that build on .NET XAML Services, you have two choices for how to name the markup extension support type. 형식 이름은 관련 XAML 개체 작성기가 XAML에서 태그 확장 사용에 도달할 경우 태그 확장 지원 형식에 액세스하고 호출하는 방법과 관련이 있습니다.The type name is relevant to how XAML object writers attempt to access and invoke a markup extension support type when they encounter a markup extension usage in XAML. 다음 명명 전략 중 하나를 사용합니다.Use one of the following naming strategies:

  • XAML 태그 사용 토큰과 정확하게 일치하도록 형식 이름을 지정합니다.Name the type name to be an exact match to the XAML markup usage token. 예를 들어 {Collate ...} 확장 사용을 지원하려면 지원 형식의 이름을 Collate로 지정합니다.For example, to support a {Collate ...} extension usage, name the support type Collate.
  • 형식 이름이 사용 문자열 토큰과 접미사 Extension이 되도록 지정합니다.Name the type name to be the usage string token plus the suffix Extension. 예를 들어 {Collate ...} 확장 사용을 지원하려면 지원 형식의 이름을 CollateExtension로 지정합니다.For example, to support a {Collate ...} extension usage, name the support type CollateExtension.

조회 순서는 Extension접미사가 있는 클래스 이름을 먼저 찾은 다음 Extension 접미사 없이 클래스 이름을 찾는 것입니다.The order of lookup is to look for the Extension-suffixed class name first and then look for the class name without the Extension suffix.

태그 사용 관점에서 Extension 접미사를 사용의 일부로 포함하는 것이 좋습니다.From the markup usage perspective, including the Extension suffix as part of the usage is valid. 그러나 Extension 이 실제로 클래스 이름의 일부인 것처럼 동작하며, 지원 클래스에 Extension 접미사가 없는 경우 XAML 개체 작성기에서 해당 사용에 대한 태그 확장 지원 클래스를 확인하지 못합니다.However, this behaves as if Extension is truly part of the class name, and XAML object writers would fail to resolve a markup extension support class for that usage if the support class did not have the Extension suffix.

매개 변수가 없는 생성자The parameterless constructor

모든 태그 확장 지원 형식에 대해 매개 변수가 없는 public 생성자를 노출 해야 합니다.For all markup extension support types, you should expose a public parameterless constructor. XAML 개체 작성기가 개체 요소 사용에서 태그 확장을 인스턴스화하는 모든 경우에는 매개 변수가 없는 생성자가 필요 합니다.A parameterless constructor is required for any case where a XAML object writer instantiates the markup extension from an object element usage. 개체 요소 사용 지원은 태그 확장, 특히 serialization에 크게 기대하고 있습니다.Supporting object element usage is a fair expectation for a markup extension, particularly for serialization. 그러나 태그 확장의 특성 사용만 지원하려는 경우에는 public 생성자 없이 태그 확장을 구현할 수 있습니다.However, you can implement a markup extension without a public constructor if you only intend to support attribute usages of the markup extension.

태그 확장 사용에 인수가 없는 경우 사용을 지원 하려면 매개 변수가 없는 생성자가 필요 합니다.If your markup extension usage has no arguments, the parameterless constructor is required to support usage.

사용자 지정 태그 확장에 대한 생성자 패턴 및 위치 인수Constructor Patterns and Positional Arguments for a Custom Markup Extension

원하는 인수가 사용되는 태그 확장의 경우 public 생성자가 원하는 사용 모드에 해당합니다.For a markup extension with intended argument usage, the public constructors must correspond to the modes of the intended usage. 즉, 태그 확장이 하나의 위치 인수를 유효한 사용으로 요구하도록 디자인된 경우 위치 인수를 사용하는 하나의 입력 매개 변수로 public 생성자를 지원해야 합니다.In other words, if your markup extension is designed to require one positional argument as a valid usage, you should support a public constructor with one input parameter that takes the positional argument.

예를 들어 Collate 태그 확장이 해당 모드를 나타내고 CollationMode 열거형 상수로 지정된 하나의 위치 인수가 있는 모드만 지원하도록 되어 있다고 가정합니다.For example, suppose the Collate markup extension is intended to support only a mode where there is one positional argument that represents its mode, specified as a CollationMode enumeration constant. 이런 경우 다음과 같은 형식의 생성자가 있어야 합니다.In this case, there should be a constructor with the following form:

public Collate(CollationMode collationMode) {...}

기본적인 수준에서 태그 확장으로 전달된 인수는 태그의 특성 값에서 전달되기 때문에 문자열입니다.At a basic level, the arguments passed to a markup extension are a string because they are being forwarded from the markup's attribute values. 모든 인수를 문자열로 만들고 해당 수준에서 입력 작업을 합니다.You can make all of your arguments strings and work with input at that level. 그러나 태그 확장 인수가 지원 클래스에 전달되기 전에 발생하는 특정 처리에 액세스할 수 있습니다.However, you do have access to certain processing that occurs before the markup extension arguments are passed to the support class.

개념적으로 처리는 태그 확장이 만들려는 개체인 것처럼 작동한 다음 해당 멤버 값이 설정됩니다.The processing works conceptually as if the markup extension is an object to be created, and then its member values are set. 설정하도록 지정된 각 속성은 XAML을 구문 분석할 때 만든 개체에서 지정된 멤버를 설정하는 방법과 유사하게 계산됩니다.Each specified property to set is evaluated similar to how a specified member can be set on a created object when XAML is parsed. 다음과 같은 두 가지 중요한 차이점이 있습니다.There are two important differences:

  • 앞에서 설명한 대로 태그 확장 지원 형식은 XAML에서 인스턴스화하기 위해 매개 변수가 없는 생성자를 가질 필요가 없습니다.As noted previously, a markup extension support type does not need to have a parameterless constructor in order to be instantiated in XAML. 해당 개체 생성은 텍스트 구문에서 가능한 인수가 위치 인수나 명명된 인수로 토큰화되고 계산될 때까지 지연되고 그때 적절한 생성자가 호출됩니다.Its object construction is deferred until its possible arguments in the text syntax are tokenized and evaluated as either positional or named arguments, and the appropriate constructor is called at that time.
  • 태그 확장 사용은 중첩할 수 있습니다.Markup extensions usages can be nested. 가장 안쪽의 태그 확장이 먼저 계산됩니다.The innermost markup extension is evaluated first. 따라서 이러한 사용을 가정하고 생성 매개 변수 중 하나를 값 변환기(예: 태그 확장)에서 생성해야 하는 형식으로 선언할 수 있습니다.Therefore, you can assume such a usage and declare one of the construction parameters to be a type that requires a value converter (such as a markup extension) to produce.

이러한 처리에 의존하는 경우는 이전 예제에 표시되어 있습니다.A reliance on such processing was shown in the previous example. .NET XAML 서비스 XAML 개체 작성기는 열거형 상수 이름을 기본 수준에서 열거 된 값으로 처리 합니다..NET XAML Services XAML object writer processes enumeration constant names into enumerated values at a native level.

또한 태그 확장 위치 매개 변수의 텍스트 구문 처리에서는 생성 인수에 있는 형식과 연결된 형식 변환기를 사용할 수 있습니다.Processing text syntax of a markup extension positional parameter can also rely on a type converter that is associated with the type that is in the construction argument.

사용에서 토큰 발생 순서가 할당된 생성자 매개 변수의 위치 순서에 해당하기 때문에 이러한 인수를 위치 인수라고 합니다.The arguments are called positional arguments because the order in which the tokens in the usage is encountered corresponds to the positional order of the constructor parameter to which they are assigned. 예를 들어 다음과 같은 생성자 서명을 살펴보겠습니다.For example, consider the following constructor signature:

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

XAML 프로세서는 이 태그 확장에 대해 두 개의 위치 인수를 예상합니다.A XAML processor expects two positional arguments for this markup extension. {Collate AlphaUp,{x:Reference circularFile}}사용이 있는 경우 AlphaUp 토큰은 첫 번째 매개 변수로 전달되고 CollationMode 열거형 명명된 상수로 계산됩니다.If there was a usage {Collate AlphaUp,{x:Reference circularFile}}, the AlphaUp token is sent to the first parameter and evaluated as a CollationMode enumeration named constant. 내부 x:Reference 의 결과는 두 번째 매개 변수를 전달되고 개체로 계산됩니다.The result of the inner x:Reference is sent to the second parameter and evaluated as an object.

태그 확장 구문 및 처리에 대한 XAML 지정 규칙에서 쉼표는 해당 인수가 위치 인수인지 명명된 인수인지에 관계없이 인수 사이의 구분 기호입니다.In the XAML specified rules for markup extension syntax and processing, the comma is the delimiter between arguments, whether those arguments are positional arguments or named arguments.

위치 인수의 중복 인자Duplicate arity of positional arguments

XAML 개체 작성기에서 위치 인수가 있는 태그 확장 사용이 발견되는 경우 해당 개수의 인수를 사용하는 여러 생성자 인수(중복 인자)가 있어도 반드시 오류가 발생하는 것은 아닙니다.If a XAML object writer encounters a markup extension usage with positional arguments, and there are multiple constructor arguments that take that number of arguments (a duplicate arity), that is not necessarily an error. 이 동작은 사용자 지정 가능한 XAML 스키마 컨텍스트 설정인 SupportMarkupExtensionsWithDuplicateArity에 따라 달라집니다.The behavior depends on a customizable XAML schema context setting, SupportMarkupExtensionsWithDuplicateArity. SupportMarkupExtensionsWithDuplicateAritytrue인 경우 XAML 개체 작성기는 중복 인자라는 이유만으로 예외를 throw해서는 안 됩니다.If SupportMarkupExtensionsWithDuplicateArity is true, a XAML object writer should not throw an exception only for reasons of duplicate arity. 해당 지점을 벗어난 동작이 엄격하게 정의되지 않았습니다.Behavior beyond that point is not strictly defined. 기본 디자인에서는 스키마 컨텍스트가 특정 매개 변수에 사용할 수 있는 형식 정보를 포함하고 중복 후보자와 일치하는 명시적 캐스팅을 시도하여 가장 잘 일치하는 서명을 확인한다고 가정합니다.The basic design assumption is that the schema context has type information available for the specific parameters and can attempt explicit casts that match the duplicate candidates to see which signature might be the best match. 서명이 XAML 개체 작성기에서 실행되는 해당 특정 스키마 컨텍스트에서 적용되는 테스트를 통과할 수 없는 경우 예외가 throw될 수 있습니다.An exception might still be thrown if no signatures can pass the tests that are imposed by that particular schema context that is running on a XAML object writer.

기본적으로 SupportMarkupExtensionsWithDuplicateArityfalse .Net XAML 서비스용 CLR 기반에 XamlSchemaContext 있습니다.By default, SupportMarkupExtensionsWithDuplicateArity is false in the CLR-based XamlSchemaContext for .NET XAML Services. 따라서 지원 형식의 생성자에 중복 인자가 있는 태그 확장 사용이 발견되는 경우 기본 XamlObjectWriter 는 예외를 throw합니다.Thus, the default XamlObjectWriter throws exceptions if it encounters a markup extension usage where there is duplicate arity in the backing type's constructors.

사용자 지정 태그 확장에 대 한 명명 된 인수Named arguments for a custom markup extension

XAML로 지정된 태그 확장은 사용에 명명된 인수 형태를 사용할 수도 있습니다.Markup extensions as specified by XAML can also use a named arguments form for usage. 첫 번째 토큰화 수준에서 텍스트 구문이 인수로 구분됩니다.At the first level of tokenization, the text syntax is divided into arguments. 인수 내에 등호 기호(=)가 있는 인수는 명명된 인수로 식별됩니다.The presence of an equals sign (=) within any argument identifies an argument as a named argument. 또한 이러한 인수는 이름/값 쌍으로 토큰화됩니다.Such an argument is also tokenized into a name/value pair. 이 경우 이름은 태그 확장 지원 형식의 설정 가능한 공용 속성 이름을 지정합니다.The name in this case names a public settable property of the markup extension's support type. 명명된 인수 사용을 지원하려면 이러한 설정 가능한 공용 속성을 제공해야 합니다.If you intend to support named argument usage, you should provide these public settable properties. 이 속성은 공용으로 유지되는 한 상속된 속성일 수 있습니다.The properties can be inherited properties as long as they remain public.

태그 확장 구현에서 서비스 공급자 컨텍스트 액세스Accessing Service Provider Context from a Markup Extension Implementation

사용 가능한 서비스는 모든 값 변환기에서 동일합니다.The services available are the same for any value converter. 차이점은 각 값 변환기에서 서비스 컨텍스트를 수신하는 방법입니다.The difference is in how each value converter receives the service context. 서비스 액세스 및 사용 가능한 서비스는 Type Converters and Markup Extensions for XAML항목에 설명되어 있습니다.Accessing services and the services available are documented in the topic Type Converters and Markup Extensions for XAML.

태그 확장의 속성 요소 사용Property element usage of a markup extension

태그 확장 사용에 대한 시나리오는 종종 특성 사용에서 태그 확장을 사용하여 설계됩니다.The scenarios for markup extension usages are often designed around using the markup extension in attribute usage. 그러나 지원 클래스를 정의하여 속성 요소 사용을 지원할 수도 있습니다.However, it is also potentially possible to define the backing class to support property element usage.

태그 확장의 속성 요소 사용을 지원 하려면 매개 변수가 없는 public 생성자를 정의 합니다.To support property element usage of your markup extension, define a public parameterless constructor. 이 생성자는 정적 생성자가 아닌 인스턴스 생성자여야 합니다.This should be an instance constructor not a static constructor. 일반적으로 XAML 프로세서는 태그에서 처리 하는 모든 개체 요소에서 매개 변수가 없는 생성자를 호출 해야 하기 때문에이 작업이 필요 합니다. 여기에는 태그 확장 클래스가 개체 요소로 포함 됩니다.This is required because a XAML processor must generally invoke the parameterless constructor on any object element it processes from markup, and this includes markup extension classes as object elements. 고급 시나리오의 경우 클래스에 대해 기본이 아닌 생성 경로를 정의할 수 있습니다.For advanced scenarios, you can define non-default construction paths for classes. 자세한 내용은 X:FactoryMethod 지시문을 참조 하세요. 그러나 이러한 패턴을 태그 확장 용도로 사용 하면 디자이너와 원시 태그 사용자 모두 사용 패턴을 검색 하기가 훨씬 더 어려워집니다.(For more information, see x:FactoryMethod Directive.) However, you should not use these patterns for markup extension purposes because this makes discovery of the usage pattern much more difficult, both for designers and for users of raw markup.

사용자 지정 태그 확장에 대 한 특성 지정Attributing for a custom markup extension

디자인 환경과 특정 XAML 개체 작성기 시나리오를 모두 지원하려면 여러 가지 CLR 특성으로 태그 확장 지원 형식의 특성을 지정해야 합니다.To support both design environments and certain XAML object writer scenarios, you should attribute a markup extension support type with several CLR attributes. 이러한 특성은 의도된 태그 확장 사용을 보고합니다.These attributes report the intended markup extension usage.

MarkupExtensionReturnTypeAttributeType 에서 반환하는 개체 형식에 대한 ProvideValue 정보를 보고합니다.MarkupExtensionReturnTypeAttribute reports the Type information for the object type that ProvideValue returns. 순수 서명에 따라 ProvideValueObject를 반환합니다.By its pure signature, ProvideValue returns Object. 그러나 다양한 소비자는 보다 정확한 반환 형식 정보를 원할 수 있습니다.But various consumers might want more precise return type information. 여기에는 다음이 포함됩니다.This includes:

  • 태그 확장 사용에 대한 형식 인식 지원을 제공할 수 있는 디자이너 및 IDE.Designers and IDEs, who might be able to provide type-aware support for markup extension usages.
  • 대상 클래스의 SetMarkupExtension 처리기 고급 구현으로, 알려진 특정 MarkupExtension 구현을 이름별로 분기하는 대신 리플렉션을 사용하여 태그 확장의 반환 형식을 정의할 수 있습니다.Advanced implementations of SetMarkupExtension handlers on target classes, which might rely on reflection to determine a markup extension's return type instead of branching on specific known MarkupExtension implementations by name.

태그 확장 사용의 SerializationSerialization of markup extension usages

XAML 개체 작성기에서 태그 확장 사용을 처리하고 ProvideValue를 호출하면 이전의 태그 확장 사용에 대한 컨텍스트가 개체 그래프가 아닌 XAML 노드 스트림에 유지됩니다.When a XAML object writer processes a markup extension usage and calls ProvideValue, the context for it previously being a markup extension usage persists in the XAML node stream but not in the object graph. 개체 그래프에서는 값만 유지됩니다.In the object graph, only the value is preserved. 원래 태그 확장 사용을 직렬화된 출력으로 유지해야 하는 다른 이유나 디자인 시나리오가 있는 경우 로드 경로 XAML 노드 스트림에서 태그 확장 사용을 추적하기 위한 고유 인프라를 설계해야 합니다.If you have design scenarios or other reasons for persisting the original markup extension usage into the serialized output, you must design your own infrastructure for tracking the markup extension usages from the load path XAML node stream. 로드 경로에서 노드 스트림의 요소를 다시 만드는 동작을 구현하고 저장 경로에서 serialization을 위해 XAML 작성기로 다시 재생하여 노드 스트림의 적절한 위치에 있는 값을 대체할 수 있습니다.You can implement behavior to recreate the elements of the node stream from the load path and play them back to XAML writers for serialization in the save path, substituting for the value in the appropriate position of the node stream.

XAML 노드 스트림의 태그 확장Markup extensions in the XAML node stream

로드 경로에서 XAML 노드 스트림을 사용하여 작업하는 경우 태그 확장 사용은 개체로 노드 스트림에 나타납니다.If you are working with a XAML node stream on the load path, a markup extension usage appears in the node stream as an object.

태그 확장 사용에서 위치 인수를 사용하는 경우 초기화 값을 가진 시작 개체로 표현됩니다.If the markup extension usage uses positional arguments, it is represented as a start object with an initialization value. 대략적인 텍스트 표현으로 노드 스트림은 다음과 유사합니다.As a rough text representation, the node stream resembles the following:

StartObject (XamlType 은 반환 형식이 아니라 태그 확장의 정의 형식임)StartObject (XamlType is the markup extension's definition type, not its return type)

StartMember ( XamlMember 의 이름은 _InitializationText임)StartMember (name of the XamlMember is _InitializationText)

Value (값은 사이의 구분 기호를 포함하는 문자열로의 위치 인수임)Value (value is the positional arguments as a string including the intervening delimiters)

EndMember

EndObject

명명된 인수를 사용하는 태그 확장 사용은 관련 이름의 멤버가 있는 개체로 표현되고, 각각은 텍스트 문자열 값으로 설정됩니다.A markup extension usage with named arguments is represented as an object with members of the relevant names, each set with text string values.

실제로 태그 확장의 ProvideValue 구현을 호출하려면 형식 매핑이 필요하고 태그 확장 지원 형식 인스턴스를 만들어야 하기 때문에 XAML 스키마 컨텍스트가 필요합니다.Actually invoking the ProvideValue implementation of a markup extension requires the XAML schema context because that requires type-mapping and creating a markup extension support type instance. 이러한 이유로 태그 확장 사용이 기본 .NET XAML 서비스 노드 스트림에서 이런 방식으로 유지 됩니다. 로드 경로의 판독기 부분에서 필요한 XAML 스키마 컨텍스트를 사용할 수 없는 경우가 많습니다.This is one reason why markup extension usages are preserved this way in the default .NET XAML Services node streams - the reader part of a load path often does not have the necessary XAML schema context available.

일반적으로 저장 경로에서 XAML 노드 스트림을 사용하여 작업하는 경우 직렬화할 개체가 처음에는 태그 확장 사용 및 ProvideValue 결과에서 제공되었음을 알릴 수 있는 것이 개체 그래프 표현에 없습니다.If you are working with a XAML node stream on the save path, there generally is nothing present in an object graph representation that can inform you that the object to serialize was originally provided by a markup extension usage and a ProvideValue result. 라운드트립에 대한 태그 확장 사용을 유지하면서 개체 그래프의 다른 변경 내용도 캡처해야 하는 시나리오에서는 원래 XAML 입력에서 태그 확장 사용에 대한 지식을 유지할 수 있는 고유한 기술을 고안해야 합니다.Scenarios that need to persist markup extension usages for round-tripping while also capturing other changes in the object graph must devise their own techniques for preserving the knowledge of a markup extension usage from the original XAML input. 예를 들어 태그 확장 사용을 복원하려면 저장 경로의 노드 스트림에서 작업하여 태그 확장 사용을 복원하거나 원래 XAML과 라운드트립 XAML 간에 병합을 수행해야 할 수 있습니다.For example, to restore the markup extension usages, you may need to work with the node stream on the save path in order to restore markup extension usages, or perform some type of merge between the original XAML and the round-tripped XAML. WPF와 같은 일부 XAML 구현 프레임워크에서는 중간 형식(식)을 사용하여 태그 확장 사용에서 값을 제공한 경우를 나타낼 수 있습니다.Some XAML-implementing frameworks such as WPF use intermediate types (expressions) to help represent cases where markup extension usages provided the values.

참고 항목See also