프레임워크 속성 메타데이터(WPF .NET)

WPF(Windows Presentation Foundation) 프레임워크 수준에서 종속성 속성의 프레임워크 속성 메타데이터 옵션을 설정할 수 있습니다. WPF 프레임워크 수준 지정은 WPF 프레젠테이션 API 및 실행 파일이 렌더링과 데이터 바인딩을 처리할 때 적용됩니다. 프레젠테이션 API 및 실행 파일은 종속성 속성의 FrameworkPropertyMetadata를 쿼리합니다.

중요

.NET 7 및 .NET 6에 관한 데스크톱 가이드 설명서는 제작 중입니다.

필수 구성 요소

이 문서에서는 독자들이 종속성 속성에 대한 기본 지식을 갖고 있으며 종속성 속성 개요를 읽었다고 가정합니다. XAML(Extensible Application Markup Language)에 익숙하고 WPF 애플리케이션을 작성하는 방법을 알고 있으면 이 문서의 예제를 따라 하는 데 도움이 됩니다.

프레임워크 속성 메타데이터 범주

FrameworkPropertyMetadata는 다음 범주로 분류됩니다.

  • 요소의 레이아웃에 영향을 주는 메타데이터, 특히 AffectsArrange, AffectsMeasure, AffectsRender 메타데이터 플래그. 종속성 속성 구현이 시각적 측면에 영향을 미치고 클래스에서 MeasureOverride 또는 ArrangeOverride를 구현 중인 경우 이러한 플래그를 설정할 수 있습니다. MeasureOverrideArrangeOverride 메서드는 레이아웃 시스템에 구현별 동작 및 렌더링 정보를 제공합니다. AffectsArrange, AffectsMeasure 또는 AffectsRender가 종속성 속성의 메타데이터에서 true로 설정되어 있고 해당 유효 값이 변경되면 WPF 속성 시스템은 요소의 시각적 개체를 무효화하여 다시 그리기를 트리거하는 요청을 시작합니다.

  • 요소의 부모 요소의 레이아웃에 영향을 주는 메타데이터, 특히 AffectsParentArrangeAffectsParentMeasure 메타데이터 플래그. 이러한 플래그를 설정하는 WPF 종속성 속성의 예는 FixedPage.LeftParagraph.KeepWithNext입니다.

  • 속성 값 상속 메타데이터, 특히 InheritsOverridesInheritanceBehavior 메타데이터 플래그. 기본적으로 종속성 속성은 값을 상속하지 않습니다. OverridesInheritanceBehavior를 사용하면 상속 경로를 시각적 트리로 이동할 수 있습니다. 이 동작은 일부 컨트롤 합성 시나리오에 필요합니다. 자세한 내용은 속성 값 상속을 참조하세요.

    참고

    속성 값의 컨텍스트에서 "상속"이라는 용어는 종속성 속성에만 해당하며, 파생 형식을 통한 관리 코드 형식 및 멤버 상속과 직접적 관련이 없습니다. 종속성 속성의 컨텍스트에서는 자식 요소가 부모 요소에서 종속성 속성 값을 상속할 수 있음을 의미 합니다.

  • 데이터 바인딩 메타데이터, 특히 BindsTwoWayByDefaultIsNotDataBindable 메타데이터 플래그. 기본적으로 WPF 프레임워크의 종속성 속성은 단방향 바인딩을 지원합니다. 상태를 보고하고 사용자 동작에 의해 수정 가능한 속성(예: IsSelected)에는 양방향 바인딩을 기본값으로 설정하는 것이 좋습니다. 컨트롤의 사용자가 속성이 컨트롤을 구현할 것으로 예상하는 경우(예: TextBox.Text)에도 양방향 바인딩을 기본값으로 설정하는 것이 좋습니다. BindsTwoWayByDefault는 기본 바인딩 모드에만 영향을 줍니다. 바인딩의 데이터 흐름 방향을 편집하려면 Binding.Mode를 설정합니다. 사용 사례가 없는 경우 IsNotDataBindable을 사용하여 데이터 바인딩을 사용하지 않도록 설정할 수 있습니다. 데이터 바인딩에 대한 자세한 내용은 데이터 바인딩 개요를 참조하세요.

  • 저널링 메타데이터, 특히 Journal 메타데이터 플래그. Journal 플래그의 기본값은 일부 종속성 플래그(예: SelectedIndex)의 경우 true뿐입니다. 사용자 입력 컨트롤은 저장되어야 하는 사용자 선택이 값에 보관되는 속성에 Journal 플래그를 설정해야 합니다. Journal 플래그는 WPF 저널링 서비스를 포함하여 저널링을 지원하는 애플리케이션 또는 서비스에서 읽습니다. 탐색 단계 저장에 대한 자세한 내용은 탐색 개요를 참조하세요.

FrameworkPropertyMetadataUIPropertyMetadata에서 직접 파생되고, 여기에 설명된 플래그를 구현합니다. 특별히 설정하지 않으면 FrameworkPropertyMetadata 플래그의 기본값은 false입니다.

FrameworkPropertyMetadata 읽기

종속성 속성의 메타데이터를 검색하려면 DependencyProperty 식별자에서 GetMetadata를 호출합니다. GetMetadata 호출은 PropertyMetadata 개체를 반환합니다. 프레임워크 메타데이터 값을 쿼리해야 하는 경우 PropertyMetadataFrameworkPropertyMetadata에 캐스트합니다.

FrameworkPropertyMetadata 지정

종속성 속성을 등록할 때 메타데이터를 만들고 할당하는 옵션이 있습니다. 할당하는 메타데이터 개체는 PropertyMetadata 또는 FrameworkPropertyMetadata와 같은 파생 클래스 중 하나일 수 있습니다. 렌더링 및 데이터 바인딩을 위해 WPF 프레젠테이션 API 및 실행 파일을 사용하는 종속성 속성에는 FrameworkPropertyMetadata를 선택합니다. 고급 옵션은 FrameworkPropertyMetadata에서 파생하여 더 많은 플래그가 있는 사용자 지정 메타데이터 보고 클래스를 만드는 것입니다. 또는 UI 렌더링에 영향을 주는 비프레임워크 속성에는 UIPropertyMetadata를 사용할 수 있습니다.

메타데이터 옵션은 일반적으로 새 종속성 속성을 등록하는 동안 설정되지만, OverrideMetadata 또는 AddOwner 호출에서 다시 지정할 수 있습니다. 메타데이터를 재정의할 때는 항상 속성 등록 중에 사용된 것과 동일한 메타데이터 형식으로 재정의하세요.

FrameworkPropertyMetadata를 통해 노출되는 속성 특성을 플래그라고도 합니다. FrameworkPropertyMetadata 인스턴스를 만드는 경우 플래그 값을 채우는 두 가지 방법이 있습니다.

  1. FrameworkPropertyMetadataOptions 열거형 형식의 인스턴스에 플래그를 설정합니다. FrameworkPropertyMetadataOptions에서 메타데이터 플래그를 비트 OR 조합으로 지정할 수 있습니다. 그런 다음 FrameworkPropertyMetadataOptions 매개 변수가 있는 생성자를 사용하여 FrameworkPropertyMetadata를 인스턴스화하고 FrameworkPropertyMetadataOptions 인스턴스를 전달합니다. FrameworkPropertyMetadata 생성자에 FrameworkPropertyMetadataOptions를 전달한 후 메타데이터 플래그를 변경하려면 새 FrameworkPropertyMetadata 인스턴스에서 해당 속성을 변경합니다. 예를 들어 FrameworkPropertyMetadataOptions.NotDataBindable 플래그를 설정한 경우 FrameworkPropertyMetadata.IsNotDataBindablefalse로 설정하여 실행 취소할 수 있습니다.

  2. FrameworkPropertyMetadataOptions 매개 변수가 없는 생성자를 사용하여 FrameworkPropertyMetadata를 인스턴스화한 다음 FrameworkPropertyMetadata에서 해당 Boolean 플래그를 설정합니다. FrameworkPropertyMetadata 인스턴스를 종속성 속성과 연결하기 전에 플래그 값을 설정해야 합니다. 그러지 않으면 InvalidOperationException이 발생합니다.

메타데이터 재정의 동작

프레임워크 속성 메타데이터를 재정의하면 변경된 메타데이터 값이 원래 값을 대체하거나 원래 값과 병합됩니다.

  • PropertyChangedCallback의 경우 기본 병합 논리는 이전 PropertyChangedCallback 값을 테이블에 보존하며, 모든 값은 속성 변경 시 호출됩니다. 콜백 순서는 클래스 깊이에 따라 결정됩니다. 계층 구조의 기본 클래스에 의해 등록된 콜백이 먼저 실행됩니다. 상속된 콜백은 한 번만 실행되며, 메타데이터에 추가된 클래스가 소유합니다.

  • DefaultValue의 경우 새 값이 기존 기본값을 대체합니다. 재정의 메타데이터에서 DefaultValue를 지정하지 않고 기존 FrameworkPropertyMetadataInherits 플래그가 설정된 경우 DefaultValue 메타데이터에 지정된 가장 가까운 상위 항목에서 기본값을 가져옵니다.

  • CoerceValueCallback의 경우 새 값이 기존 CoerceValueCallback 값을 대체합니다. 재정의 메타데이터에서 CoerceValueCallback을 지정하지 않으면 CoerceValueCallback을 지정한 상속 체인의 가장 가까운 상위 요소에서 값을 가져옵니다.

  • FrameworkPropertyMetadata 비상속 플래그의 경우 기본값 falsetrue 값으로 재정의할 수 있습니다. 다만 Inherits, Journal, OverridesInheritanceBehavior, SubPropertiesDoNotAffectRendertrue 값을 false 값으로 재정의할 수 있습니다.

참고

기본 병합 논리는 Merge 메서드에 의해 구현됩니다. 종속성 속성을 상속하는 파생 클래스에서 Merge를 재정의하여 사용자 지정 병합 논리를 지정할 수 있습니다.

참고 항목