다음을 통해 공유


디자인 타임 메타데이터 제공

사용자 지정 WPF 및 Silverlight 컨트롤에 대한 디자인 환경을 만드는 경우 각 환경을 별개의 디자인 타임 어셈블리에 배포합니다. 메타데이터 특성으로 채워진 테이블을 만들어 이러한 사용자 지정 디자인 타임 구현이 Visual Studio 및 Expression Blend와 같은 도구와 상호 작용하는 방식을 지정할 수 있습니다.

디자인 타임 어셈블리

Visual Studio와 같은 디자인 도구에서 사용자 지정 컨트롤의 어셈블리를 열면 관련 디자인 타임 어셈블리도 검색됩니다. 특히 디자인 도구에서는 ProvideMetadataAttribute 어셈블리 수준 특성을 검색합니다. 이 특성을 찾으면 디자이너는 어셈블리에서 IProvideAttributeTable 인터페이스를 구현하는 클래스를 검색합니다. 디자이너는 이 클래스의 AttributeTable 속성을 쿼리하여 디자인 타임 동작을 지정하는 특성 컬렉션을 검색합니다. 자세한 내용은 연습: 사용자 지정 디자인 타임 메타데이터 제공사용자 지정 컨트롤 및 디자인 타임 어셈블리 배포를 참조하십시오.

특성 테이블

AttributeTable 클래스는 디자인 타임 메타데이터 특성을 WPF 및 Silverlight 형식에 연결합니다. 특성 테이블은 디자인 가능한 형식에 대해 특정 디자인 타임 구현을 지정합니다. 예를 들어 컨트롤에 대해 사용자 지정 AdornerPanel을 만든 경우 FeatureAttribute를 특성 테이블에 추가하여 사용자 지정 FeatureProvider 구현을 지정합니다.

특성 테이블 작성기

특성 테이블을 만들려면 우선 AttributeTableBuilder 클래스의 인스턴스를 만듭니다. AddCustomAttributes 메서드를 호출하여 특성 테이블 작성기에 메타데이터를 추가합니다. 메타데이터 추가 작업이 끝나면 CreateTable 메서드를 호출하여 특성 테이블을 생성합니다. 특성 테이블 작성기 메서드는 콜백 대리자를 지원하므로 필요할 때까지 특성 테이블 생성을 지연시킬 수 있습니다.

다음 코드 예제에서는 특성 테이블을 사용하여 사용자 지정 표시기 구현을 지정하는 방법을 보여 줍니다.

' Container for any general design-time metadata to initialize.
' Designers look for a type in the design-time assembly that 
' implements IProvideAttributeTable. If found, designers instantiate
' this class and access its AttributeTable property automatically.
Friend Class Metadata
    Implements IProvideAttributeTable

    ' Accessed by the designer to register any design-time metadata.
    Public ReadOnly Property AttributeTable() As AttributeTable _
        Implements IProvideAttributeTable.AttributeTable
        Get
            Dim builder As New AttributeTableBuilder()

            ' Add the adorner provider to the design-time metadata.
            builder.AddCustomAttributes(GetType(ButtonWithDesignTime), _
                                        New FeatureAttribute(GetType(OpacitySliderAdornerProvider)))

            Return builder.CreateTable()
        End Get
    End Property


End Class
// Container for any general design-time metadata to initialize.
// Designers look for a type in the design-time assembly that 
// implements IProvideAttributeTable. If found, designers instantiate 
// this class and access its AttributeTable property automatically.
internal class Metadata : IProvideAttributeTable
{
    // Accessed by the designer to register any design-time metadata.
    public AttributeTable AttributeTable
    {
        get 
        {
            AttributeTableBuilder builder = new AttributeTableBuilder();

            // Add the adorner provider to the design-time metadata.
            builder.AddCustomAttributes(
                typeof(ButtonWithDesignTime),
                new FeatureAttribute(typeof(OpacitySliderAdornerProvider)));

            return builder.CreateTable();
        }
    }
}

자세한 내용은 연습: 디자인 타임 표시기 만들기를 참조하십시오.

기본 디자인 타임 구현 워크플로

일반적으로 사용자 지정 디자인 환경을 만들 때와 비슷한 워크플로를 따릅니다. 자세한 내용은 방법: 사용자 지정 컨트롤 및 디자인 타임 어셈블리 배포를 참조하십시오.

사용자 지정 디자인 타임 환경을 구현하는 방법을 보여 주는 예제는 WPF and Silverlight Designer Extensibility Samples 사이트를 참조하십시오.

별개의 디자인 타임 어셈블리를 만들 경우의 장점

WPF Designer for Visual Studio 프레임워크에서는 디자인 타임 메타데이터가 구현과 분리됩니다. 메타데이터를 컨트롤의 런타임 코드와 분리하는 것은 디자인 측면에서 중요한 원칙이며 그 이유는 다음과 같습니다.

  • 팀 간에 순환 및 통합 논리를 구축할 경우 메타데이터를 컨트롤에 컴파일하는 작업이 번거로워질 수 있습니다.

  • 메타데이터를 컨트롤에 컴파일하면 WPF Designer 또는 Expression Blend와 같은 외부 도구가 나중에 메타데이터를 수정할 수 없습니다. 이는 신속성의 측면에서 문제가 됩니다. 디자인 타임 메타데이터를 컨트롤과 분리하지 않을 경우 Visual Studio에서 해당 디자이너의 버전을 관리하려면 .NET Framework의 새 버전이 있어야 합니다.

  • 메타데이터를 컨트롤에 컴파일하면 컨트롤 어셈블리의 크기가 대폭 커집니다. 또한 디자인 타임 특성도 컨트롤을 느리게 만듭니다. 리플렉션을 사용하는 데이터 바인딩과 같은 컨트롤 기능의 경우 추가 특성이 메모리에 로드될 때 영향을 받습니다.

  • 디자인 타임 메타데이터는 디자이너의 "특성(personality)"을 제공합니다. 디자이너의 기능은 컨트롤이 아니라 디자이너를 호스팅하는 응용 프로그램과 대부분 연결됩니다. WPF Designer 및 Expression Blend에서는 다양한 메타데이터 집합을 사용하여 특정 사용자층을 대상으로 하는 기능 집합을 제공합니다.

참고 항목

참조

AttributeTable

ProvideMetadataAttribute

기타 리소스

방법: 사용자 지정 컨트롤 및 디자인 타임 어셈블리 배포

사용자 지정 컨트롤 및 디자인 타임 어셈블리 배포

기본 확장성 개념

WPF Designer 확장성 이해