.NET XAML 서비스에서 사용할 사용자 지정 형식 정의
비즈니스 개체이거나 특정 프레임워크에 대한 종속성이 없는 형식인 사용자 지정 형식을 정의하는 경우 XAML에 대해 수행할 수 있는 특정 모범 사례가 있습니다. 이러한 사례를 따르는 경우 .NET XAML 서비스 및 해당 XAML 판독기 및 XAML 작성기는 형식의 XAML 특성을 검색하고 XAML 형식 시스템을 사용하여 XAML 노드 스트림에서 적절한 표현을 제공할 수 있습니다. 이 항목에서는 형식 정의, 멤버 정의 및 형식 또는 멤버의 CLR 특성 지정에 대한 모범 사례를 설명합니다.
XAML에 대한 생성자 패턴 및 형식 정의
XAML에서 개체 요소로 인스턴스화하려면 사용자 지정 클래스가 다음 요구 사항을 충족해야 합니다.
사용자 지정 클래스는 public이어야 하며 매개 변수가 없는 공용 생성자를 노출해야 합니다. 구조에 대한 참고 사항은 다음 섹션을 참조하세요.
사용자 지정 클래스는 중첩 클래스가 아니어야 합니다. 전체 이름 경로의 추가 "점"은 클래스 네임스페이스 나누기를 모호하게 만들고 연결된 속성과 같은 다른 XAML 기능을 방해합니다. 개체를 개체 요소로 인스턴스화할 수 있는 경우 생성된 개체는 개체를 기본 형식으로 사용하는 속성의 속성 요소 형식을 채울 수 있습니다.
값 변환기를 사용하도록 설정한 경우에도 이러한 조건을 충족하지 않는 형식에 개체 값을 제공할 수 있습니다. 자세한 내용은 XAML대한
구조
구조체는 항상 CLR 정의에 따라 XAML에서 생성할 수 있습니다. 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 get
및 set
접근자 패턴 및 언어에 적합한 키워드를 사용하여 속성을 공용 CLR 속성으로 정의하는 경우 XAML 형식 시스템은 IsReadPublic 및 IsWritePublic같은 XamlMember 속성에 제공된 적절한 정보를 사용하여 속성을 멤버로 보고할 수 있습니다.
특정 속성은 TypeConverterAttribute적용하여 텍스트 구문을 사용하도록 설정할 수 있습니다. 자세한 내용은 XAML대한
텍스트 구문 또는 네이티브 XAML 변환이 없는 경우 및 태그 확장 사용과 같은 추가 간접 참조가 없는 경우 XAML 형식 시스템에서TargetType 속성 형식은 대상 형식을 CLR 형식으로 처리하여 인스턴스를 XAML 개체 작성기에 반환할 수 있어야 합니다.
XAML 2009를 사용하는 경우 이전 고려 사항이 충족되지 않는 경우 x:Reference 태그 확장 사용하여 값을 제공할 수 있습니다. 그러나 이는 형식 정의 문제보다 더 많은 사용 문제입니다.
이벤트
이벤트를 공용 CLR 이벤트로 정의하는 경우 XAML 형식 시스템은 IsEventtrue
이벤트를 멤버로 보고할 수 있습니다. 이벤트 처리기를 배선하는 것은 .NET XAML 서비스 기능의 범위 내에 있지 않습니다. 배선은 특정 프레임워크 및 구현에 남아 있습니다.
방법
메서드의 인라인 코드는 기본 XAML 기능이 아닙니다. 대부분의 경우 XAML에서 메서드 멤버를 직접 참조하지 않으며 XAML의 메서드 역할은 특정 XAML 패턴에 대한 지원만 제공하는 것입니다. x:FactoryMethod 지시문 예외입니다.
필드
CLR 디자인 지침은 비정적 필드를 권장하지 않습니다. 정적 필드의 경우 x:Static Markup Extension;
연결 가능한 멤버
연결 가능한 멤버는 정의 형식의 접근자 메서드 패턴을 통해 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
접근자에 특성을 지정해야 합니다.
연결 가능한 멤버 저장소
접근자 메서드는 일반적으로 개체 그래프에 연결 가능한 멤버 값을 배치하거나 개체 그래프에서 값을 검색하고 제대로 serialize하는 방법을 제공하기에 충분하지 않습니다. 이 기능을 제공하려면 이전 접근자 서명의 target
개체가 값을 저장할 수 있어야 합니다. 스토리지 메커니즘은 연결 가능한 멤버가 멤버 목록에 없는 대상에 멤버를 연결할 수 있다는 연결 가능한 멤버 원칙과 일치해야 합니다. .NET XAML Services는 API IAttachedPropertyStore 및 AttachablePropertyServices통해 연결 가능한 멤버 저장소에 대한 구현 기술을 제공합니다.
IAttachedPropertyStore XAML 작성기에서 저장소 구현을 검색하는 데 사용되며 접근자의 target
형식에서 구현되어야 합니다. 정적 AttachablePropertyServices API는 접근자의 본문 내에서 사용되며 해당 AttachableMemberIdentifier연결 가능한 멤버를 참조합니다.
CLR 특성 XAML-Related
XAML 형식 시스템 정보를 .NET XAML Services에 보고하려면 형식, 멤버 및 어셈블리의 특성을 올바르게 지정하는 것이 중요합니다. 다음 상황 중 하나가 적용되는 경우 보고 XAML 형식 시스템 정보는 관련이 있습니다.
- .NET XAML Services XAML 판독기 및 XAML 기록기에 직접 기반한 XAML 시스템에서 형식을 사용할 수 있습니다.
- 이러한 XAML 판독기 및 XAML 작성기를 기반으로 하는 XAML 사용 프레임워크를 정의하거나 사용합니다.
사용자 지정 형식의 XAML 지원과 관련된 각 XAML 관련 특성 목록은 사용자 지정 형식 및 라이브러리대한
사용법
사용자 지정 형식을 사용하려면 태그 작성자가 사용자 지정 형식을 포함하는 어셈블리 및 CLR 네임스페이스에 대한 접두사를 매핑해야 합니다. 이 절차는 이 항목에 설명되어 있지 않습니다.
액세스 수준
XAML은 internal
액세스 수준이 있는 형식을 로드하고 인스턴스화하는 방법을 제공합니다. 이 기능은 사용자 코드가 자체 형식을 정의한 다음 동일한 사용자 코드 범위의 일부인 태그에서 해당 클래스를 인스턴스화할 수 있도록 제공됩니다.
WPF의 예는 사용자 코드가 UI 동작을 리팩터링하는 방법으로 의도된 UserControl 정의할 때마다 있지만, public
액세스 수준으로 지원 클래스를 선언하여 암시될 수 있는 확장 메커니즘의 일부가 아닙니다. 지원 코드가 XAML 형식으로 참조되는 동일한 어셈블리로 컴파일되는 경우 이러한 UserControlinternal
액세스 권한으로 선언할 수 있습니다.
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
액세스 수준을 사용하거나 관련 클래스를 별도의 어셈블리로 팩터하고 해당 어셈블리를 종속적으로 만들어야 합니다.
참고 항목
- 사용자 지정 형식 및 라이브러리 대한 CLR 특성
XAML-Related - XAML Services
.NET Desktop feedback