다음을 통해 공유


.NET XAML 서비스에서 사용할 사용자 지정 형식 정의

비즈니스 개체이거나 특정 프레임워크에 종속되지 않은 형식인 사용자 지정 형식을 정의할 때 따를 수 있는 XAML 모범 사례가 있습니다. 이러한 모범 사례를 따르면 .NET XAML 서비스 및 해당 XAML 판독기와 XAML 작성기가 형식의 XAML 특성을 발견하고 XAML 형식 시스템을 사용하여 XAML 노드 스트림에서 적절한 표현을 제공할 수 있습니다. 이 토픽에서는 형식 정의, 멤버 정의 및 형식 또는 멤버의 CLR 특성에 대한 모범 사례를 설명합니다.

XAML에 대한 생성자 패턴 및 형식 정의

XAML에서 개체 요소로 인스턴스화하려면 사용자 지정 클래스가 다음과 같은 요구 사항을 충족해야 합니다.

  • 사용자 지정 클래스는 공용이어야 하며 매개 변수 없는 공용 생성자를 노출해야 합니다. 구조체에 대한 자세한 내용은 다음 섹션을 참조하세요.

  • 사용자 지정 클래스는 중첩 클래스가 아니어야 합니다. 전체 이름 경로에 "점"이 추가되면 클래스 네임스페이스 분류가 모호해지고, 연결된 속성과 같은 다른 XAML 기능을 방해합니다. 개체를 개체 요소로 인스턴스화할 수 있는 경우 생성된 개체는 개체를 기본 형식으로 사용하는 속성의 속성 요소 형식을 채울 수 있습니다.

값 변환기를 사용하는 경우 이러한 조건을 충족하지 않는 형식의 개체 값을 계속 제공할 수 있습니다. 자세한 내용은 Type Converters and Markup Extensions for XAML합니다.

구조체

구조체는 항상 XAML에서 CLR 정의로 생성할 수 있습니다. CLR 컴파일러가 구조체에 대한 매개 변수 없는 생성자를 암시적으로 만들기 때문입니다. 이 생성자는 모든 속성 값을 기본값으로 초기화합니다.

구조체에 기본 생성 동작을 사용하는 것이 바람직하지 않은 경우도 있습니다. 구조체가 값을 채우고 개념적으로 공용 구조체로 작동하기 때문일 수 있습니다. 공용 구조체로 포함된 값의 해석이 서로 다르면 어느 속성도 설정할 수 없습니다. WPF 어휘에서 이러한 구조체의 예는 GridLength입니다. 이러한 구조체는 구조체의 값에 대해 서로 다른 해석이나 모드를 만드는 문자열 규칙을 사용하여 값을 특성 형식으로 표현할 수 있도록 형식 변환기를 구현합니다. 이러한 구조체는 매개 변수가 없는 생성자를 통해 코드를 생성하는 경우에도 이와 유사한 동작을 노출해야 합니다.

인터페이스

인터페이스는 멤버의 기본 형식으로 사용할 수 있습니다. XAML 형식 시스템은 할당 가능한 목록을 확인하고 값으로 제공되는 개체를 인터페이스에 할당할 수 있을 것으로 예상합니다. 관련된 할당 가능 형식이 XAML 생성 요구 사항을 지원하는 한 인터페이스를 XAML 형식으로 제공해야 하는 방법에 대한 개념은 없습니다.

팩터리 메서드

팩터리 메서드는 XAML 2009 기능입니다. 팩터리 메서드는 개체에 매개 변수 없는 생성자가 있어야 한다는 XAML 원칙을 수정합니다. 팩터리 메서드는 이 문서에서 설명하지 않습니다. x:FactoryMethod 지시문을 참조하세요.

열거형

열거형에는 XAML 네이티브 형식 변환 동작이 있습니다. XAML에 지정된 열거형 상수 이름은 기본 열거형 형식과 대조하여 확인되고, 열거형 값을 XAML 개체 작성기에 반환합니다.

XAML은 FlagsAttribute가 적용된 열거형에 플래그 스타일 사용을 지원합니다. 자세한 내용은 XAML 구문 정보를 참조하세요. (XAML 구문 정보는 WPF 대상 그룹을 위해 작성되었지만, 해당 토픽의 정보는 대부분 특정 구현 프레임워크와 관련이 없는 XAML과 관련이 있습니다.)

멤버 정의

형식은 XAML 사용에 대한 멤버를 정의할 수 있습니다. 형식이 XAML을 사용할 수 없는 경우에도 해당 형식이 XAML 사용 가능 멤버를 정의할 수 있습니다. 이것이 가능한 이유는 CLR 상속입니다. 멤버를 상속하는 일부 형식이 XAML 사용을 형식으로 지원하고, 멤버가 기본 형식에 대해 XAML 사용을 지원하거나 네이티브 XAML 구문을 사용할 수 있는 한 해당 멤버는 XAML을 사용할 수 있습니다.

속성

일반적인 CLR getset 접근자 패턴과 언어에 적합한 키워드를 사용하여 속성을 공용 CLR 속성으로 정의하는 경우 XAML 형식 시스템은 XamlMember 속성에 제공된 적절한 정보(예: IsReadPublicIsWritePublic)를 사용하여 속성을 멤버로 보고할 수 있습니다.

특정 속성은 TypeConverterAttribute를 적용하여 텍스트 구문을 사용할 수 있게 합니다. 자세한 내용은 Type Converters and Markup Extensions for XAML합니다.

텍스트 구문 또는 네이티브 XAML 변환이 없고 태그 확장 사용과 같은 추가 간접 참조가 없는 경우 속성의 형식(XAML 형식 시스템에서는 TargetType)은 대상 형식을 CLR 형식으로 처리하여 인스턴스를 XAML 개체 작성기에 반환할 수 있어야 합니다.

XAML 2009를 사용하는 경우 이전 고려 사항이 충족되지 않으면 x:Reference 태그 확장을 사용하여 값을 제공할 수 있습니다. 그러나 이렇게 하면 형식 정의 문제보다 더 많은 사용 문제가 발생합니다.

이벤트

이벤트를 공용 CLR 이벤트로 정의하는 경우 XAML 형식 시스템에서 이벤트를 IsEventtrue인 멤버로 보고할 수 있습니다. 이벤트 처리기 연결은 .NET XAML 서비스 기능의 범위 내에 있지 않습니다. 배선은 특정 프레임워크 및 구현에 남아 있습니다.

메서드

메서드의 인라인 코드는 기본 XAML 기능이 아닙니다. 대부분은 XAML에서 메서드 멤버를 직접 참조하지 않으며, XAML에서 메서드의 역할은 특정 XAML 패턴에 대한 지원만 제공하는 것입니다. x:FactoryMethod 지시문은 예외입니다.

필드

CLR 디자인 지침에서는 비정적 필드를 권장하지 않습니다. 정적 필드의 경우 x:Static 태그 확장을 통해서만 정적 필드 값에 액세스할 수 있습니다. 이 경우 x:Static 사용에 대한 필드를 노출하기 위해 CLR 정의에서 특별한 작업을 수행할 필요가 없습니다.

연결 가능한 멤버

연결 가능한 멤버는 정의 형식의 접근자 메서드 패턴을 통해 XAML에 노출됩니다. 정의 형식 자체는 XAML 사용 가능 개체일 필요가 없습니다. 실제로 일반적인 패턴은 연결 가능한 멤버를 소유하고 관련 동작을 구현하는 역할인 서비스 클래스를 선언하지만 UI 표현과 같은 다른 함수는 제공하지 않는 것입니다. 다음 섹션의 경우 자리 표시자 PropertyName은 연결 가능한 멤버의 이름을 나타냅니다. 해당 이름은 XamlName 문법에서 유효해야 합니다.

이러한 패턴과 형식의 다른 메서드 간에 이름이 충돌하지 않도록 주의해야 합니다. 패턴 중 하나와 일치하는 멤버가 있는 경우 의도한 것이 아니더라도 XAML 프로세서가 해당 멤버를 연결 가능한 멤버 사용 경로로 해석할 수 있습니다.

GetPropertyName 접근자

GetPropertyName 접근자에 대한 서명은 다음과 같아야 합니다.

public static object GetPropertyName(object target)

  • 구현에서 보다 구체적인 형식으로 target 개체를 지정할 수 있습니다. 이를 사용하여 연결 가능한 멤버의 사용 범위를 지정할 수 있습니다. 의도한 범위를 벗어난 사용은 잘못된 캐스트 예외를 throw한 다음, XAML 구문 분석 오류로 표시됩니다. 매개 변수 이름 target은 요구 사항이 아니지만 대부분의 구현에서 규칙에 따라 target 이름이 지정됩니다.

  • 구현에서 보다 구체적인 형식으로 반환 값을 지정할 수 있습니다.

연결 가능한 멤버의 특성 사용에 TypeConverter 사용 텍스트 구문을 지원하려면 GetPropertyName 접근자에 TypeConverterAttribute를 적용합니다. set 대신 get을 적용하는 것은 직관적이 아닌 것처럼 보일 수 있지만, 이 규칙은 직렬화할 수 있는 읽기 전용 연결 가능 멤버의 개념을 지원할 수 있으며, 이는 디자이너 시나리오에서 유용합니다.

SetPropertyName 접근자

SetPropertyName 접근자에 대한 서명은 다음과 같아야 합니다.

public static void SetPropertyName(object target, object value)

  • target 개체는 이전 섹션에서 설명한 것과 동일한 논리 및 결과를 사용하여 구현에서 보다 구체적인 형식으로 지정할 수 있습니다.

  • 구현에서 보다 구체적인 형식으로 value 개체를 지정할 수 있습니다.

이 메서드의 값은 XAML 사용에서 오는 입력이며, 일반적으로 특성 양식입니다. 특성 양식에서 텍스트 구문에 값 변환기를 지원해야 하며, 특성은 GetPropertyName 접근자에 있어야 합니다.

연결 가능한 멤버 저장소

접근자 메서드는 일반적으로 연결 가능한 멤버 값을 개체 그래프에 배치하거나, 개체 그래프에서 값을 검색하고 적절하게 직렬화하는 수단을 제공하기에 충분하지 않습니다. 이 기능을 제공하려면 이전 접근자 서명의 target 개체가 값을 저장할 수 있어야 합니다. 스토리지 메커니즘은 연결 가능한 멤버가 멤버 목록에 없는 대상에 멤버를 연결할 수 있는 연결 가능한 멤버 원칙과 일치해야 합니다. .NET XAML Services는 API의 IAttachedPropertyStoreAttachablePropertyServices를 통해 연결 가능 멤버에 대한 구현 기술을 제공합니다. IAttachedPropertyStore는 XAML 작성기에서 저장소 구현을 검색하는 데 사용되며, 접근자의 target인 형식에서 구현되어야 합니다. 정적 AttachablePropertyServices API는 접근자의 본문에서 사용되며, AttachableMemberIdentifier를 통해 연결 가능한 멤버를 참조합니다.

XAML 형식 시스템 정보를 .NET XAML Services에 보고하려면 형식, 멤버 및 어셈블리의 특성을 올바르게 지정하는 것이 중요합니다. 다음 상황 중 하나가 적용되는 경우 XAML 형식 시스템 정보를 보고하는 것이 적절합니다.

  • .NET XAML Services XAML 판독기 및 XAML 작성기에 직접 기반한 XAML 시스템에서 사용할 형식을 원합니다.
  • 이러한 XAML 판독기 및 XAML 작성기를 기반으로 하는 XAML 활용 프레임워크를 정의하거나 사용합니다.

사용자 지정 형식의 XAML 지원과 관련된 각 XAML 관련 특성 목록은 사용자 지정 형식 및 라이브러리에 대한 XAML 관련 CLR 특성을 참조하세요.

사용

사용자 지정 형식을 사용하려면 태그 작성자가 사용자 지정 형식을 포함하고 있는 어셈블리 및 CLR 네임스페이스에 대한 접두사에 매핑해야 합니다. 이 절차는 이 토픽에서 설명하지 않습니다.

액세스 수준

XAML은 internal 액세스 수준이 있는 형식을 로드하고 인스턴스화하는 방법을 제공합니다. 이 기능은 사용자 코드가 자체 형식을 정의한 다음, 동일한 사용자 코드 범위에 포함된 태그에서 해당 클래스를 인스턴스화할 수 있도록 제공됩니다.

WPF의 예는 사용자 코드가 UI 동작을 리팩터링하기 위한 방법으로 UserControl을 매번 정의하지만 public 액세스 수준으로 지원 클래스를 선언하여 암시할 수 있는 가능한 확장 메커니즘에 포함되지 않는 경우입니다. 백업 코드가 XAML 형식으로 참조되는 동일한 어셈블리로 컴파일되는 경우 internal 액세스 권한으로 이러한 UserControl을 선언할 수 있습니다.

XAML을 완전 신뢰로 로드하고 XamlObjectWriter를 사용하는 애플리케이션의 경우 internal 액세스 수준이 있는 클래스를 항상 로드할 수 있습니다.

XAML을 부분 신뢰로 로드하는 애플리케이션의 경우 XamlAccessLevel API를 사용하여 액세스 수준 특성을 제어할 수 있습니다. 또한 지연 메커니즘(예: WPF 템플릿 시스템)은 액세스 수준 권한을 전파하고 최종 런타임 평가를 위해 보존할 수 있어야 합니다. 이 작업은 XamlAccessLevel 정보를 전달하여 내부적으로 처리됩니다.

WPF 구현

WPF XAML은 부분 신뢰 액세스 모델을 사용합니다. 만약 BAML이 부분 신뢰로 로드되는 경우 액세스 권한이 BAML 원본인 어셈블리의 AssemblyAccessTo로 제한됩니다. 지연의 경우 WPF는 액세스 수준 정보를 전달하기 위한 메커니즘으로 IXamlObjectWriterFactory.GetParentSettings를 사용합니다.

WPF XAML 용어에서 내부 형식은 참조하는 XAML도 포함하는 동일한 어셈블리에 의해 정의된 형식입니다. 이러한 형식은 매핑의 어셈블리=부분을 의도적으로 생략하는 XAML 네임스페이스를 통해 매핑할 수 있습니다(예: xmlns:local="clr-namespace:WPFApplication1"). BAML이 내부 형식을 참조하고 해당 형식에 internal 액세스 수준이 있는 경우 어셈블리에 대한 GeneratedInternalTypeHelper 클래스가 생성됩니다. GeneratedInternalTypeHelper를 사용하지 않으려면 public 액세스 수준을 사용하거나, 관련 클래스를 별도의 어셈블리로 팩터링하고 해당 어셈블리가 종속되게 만들어야 합니다.

참고 항목