다음을 통해 공유


DesignModeValueProvider 클래스

디자이너에서 사용자가 수행한 속성 변경을 캡처하고 디자인 타임에 새 값을 제공합니다.

상속 계층 구조

System.Object
  Microsoft.Windows.Design.Features.FeatureProvider
    Microsoft.Windows.Design.Model.DesignModeValueProvider

네임스페이스:  Microsoft.Windows.Design.Model
어셈블리:  Microsoft.Windows.Design.Interaction(Microsoft.Windows.Design.Interaction.dll)

구문

‘선언
Public Class DesignModeValueProvider _
    Inherits FeatureProvider
public class DesignModeValueProvider : FeatureProvider
public ref class DesignModeValueProvider : public FeatureProvider
type DesignModeValueProvider =  
    class
        inherit FeatureProvider
    end
public class DesignModeValueProvider extends FeatureProvider

DesignModeValueProvider 형식에서는 다음과 같은 멤버를 노출합니다.

생성자

  이름 설명
Public 메서드 DesignModeValueProvider DesignModeValueProvider 클래스의 새 인스턴스를 초기화합니다.

위쪽

속성

  이름 설명
Public 속성 Properties 캡처할 속성 집합을 가져옵니다.

위쪽

메서드

  이름 설명
Public 메서드 Equals 지정한 Object가 현재 Object와 같은지 여부를 확인합니다. (Object에서 상속됨)
Protected 메서드 Finalize 가비지 수집에서 회수하기 전에 개체에서 리소스를 해제하고 다른 정리 작업을 수행할 수 있게 합니다. (Object에서 상속됨)
Public 메서드 GetHashCode 특정 형식에 대한 해시 함수 역할을 합니다. (Object에서 상속됨)
Public 메서드 GetType 현재 인스턴스의 Type을 가져옵니다. (Object에서 상속됨)
Protected 메서드 InvalidateProperty 지정된 속성을 무효화합니다.
Protected 메서드 MemberwiseClone 현재 Object의 단순 복사본을 만듭니다. (Object에서 상속됨)
Public 메서드 ToString 현재 개체를 나타내는 문자열을 반환합니다. (Object에서 상속됨)
Public 메서드 TranslatePropertyValue 디자이너에서 사용자가 수행한 속성 변경을 캡처하고 디자인 타임에 새 값을 제공하는 사용자 지정 논리를 사용합니다.

위쪽

설명

일반적으로 사용자가 디자이너에서 개체의 속성 값을 변경할 경우 해당 값은 디자이너에서 개체에 설정됩니다. DesignModeValueProvider 클래스를 사용하여 고유의 논리를 이 프로세스에 삽입할 수 있습니다. 예를 들어 사용자가 컨트롤의 visible 속성을 false로 설정할 수 있게 할 수 있지만 컨트롤은 디자인 타임에 여전히 볼 수 있어야 합니다.

이를 위해 DesignModeValueProvider를 만들고 사용자 지정 컨트롤에 연결합니다. DesignModeValueProvider는 사용자가 속성에서 변경한 내용을 캡처합니다. 그리고 TranslatePropertyValue 메서드에 고유의 논리를 삽입하면 DesignModeValueProvider가 새 값을 디자이너에 전달합니다.

중요

이 방법을 사용하면 디자이너의 속성 동작이 XAML 뷰의 속성 값과 일치하지 않습니다. XAML 뷰에서는 사용자가 디자인 타임에 입력한 값을 표시합니다. XAML 뷰의 값은 런타임에 속성에서 발생할 동작을 나타냅니다.

다음 제한 사항은 DesignModeValueProvider 클래스를 사용하여 디자인 타임에 속성 값을 변경할 때 적용됩니다.

  • DependencyObject 클래스로부터 파생되는 형식에 대한 디자인 타임 값 공급자만 설정할 수 있습니다.

  • 종속성 속성에는 디자인 타임 값 공급자만 설정할 수 있습니다.

  • DesignModeValueProvider 구현은 기본 형식 속성에 디자인 타임 값을 설정해야 합니다. 특정 파생된 형식을 대상으로 하는 값 공급자를 구현할 수 있습니다. 예를 들어, Button 클래스의 Height 속성에 대해 값 공급자를 등록하려면 FrameworkElement 클래스에서 이를 등록하고 값 공급자 구현에서 대상 형식을 테스트해야 합니다. 자세한 내용은 연습: 디자인 타임에 속성 동작 변경을 참조하십시오.

  • 값 공급자는 등록된 순서로 실행됩니다. 속성에 등록된 최신 값 공급자는 마지막에 실행되지만 모든 값 공급자가 실행됩니다.

  • 값 공급자의 TranslatePropertyValue 구현이 nullNull 참조(Visual Basic의 경우 Nothing)을 반환하는 경우 속성의 디자인 타임 값이 nullNull 참조(Visual Basic의 경우 Nothing)로 설정됩니다.

  • 값 공급자의 TranslatePropertyValue 구현이 정적 값 UnsetValue를 반환하는 경우 WPF Designer는 속성에서 ClearValue 메서드를 호출합니다.

참고

Silverlight 컨트롤의 값 공급자를 작성하는 경우 UnsetValue의 WPF 버전을 사용해야 합니다. 이는 WPF Designer 프레임워크의 제한 사항입니다.

  • 값 공급자는 WPF 상속된 속성에서 작동하지 않습니다. 예를 들어, FlowDirection에 대해 값 공급자를 등록하면 디자인 모드에서 예상대로 작동하지 않습니다.

  • 바인딩을 사용하여 속성 값을 설정하면 값 공급자는 계산된 값 대신 Binding을 반환해야 합니다.

  • 디자이너가 특정 디자인 시간 값으로 속성을 적용하여 특정 디자인 경험을 보장하도록 해야 할 수 있기 때문에 일부 값 공급자는 적용되지 않을 수 있습니다. 예를 들어, 글꼴 속성에 대한 사용자 지정 값 공급자는 WPF Designer에서 예상한 대로 작동하지 않습니다.

  • TypeIdentifier를 사용하여 값 공급자를 등록하면 TranslatePropertyValue 구현에 전달되는 형식 식별자는 디자인 타임 메타데이터에 지정된 식별자와 같지 않을 수 있습니다. 동일하지만 같은 인스턴스는 아닐 수 있습니다. 값 공급자가 형식 확인을 수행하는 경우 속성 식별자의 형식 구성 요소를 확인하고 확인된 형식에서 형식이 같은지 테스트를 수행해야 합니다. 대개 속성의 이름을 단순히 확인하지만 형식에 대한 논리를 수행해야 하는 경우 형식 식별자를 확인해야 합니다. ResolveType 메서드를 사용하여 올바른 형식을 가져옵니다.

  • WPF Designer 프레임워크는 여러 지원되는 형식으로 형식 식별자를 전달할 수 있습니다. 값 공급자가 형식 비교를 수행하는 경우 실제 형식에 대한 형식 식별자를 확인해야 합니다. ResolveType 메서드를 사용하여 올바른 형식을 가져옵니다.

예제

다음 예제에서는 사용자 지정 단추 컨트롤에 연결될 사용자 지정 DesignModeValueProvider를 만듭니다. TranslatePropertyValue 메서드에서 ButtonContent 속성을 변경하여 디자이너에서 대문자로 표시되도록 합니다. ButtonBackground 속성을 변경하여 디자이너에서 기본 시스템 색으로 나타나도록 합니다. 이러한 변경은 디자이너에만 적용됩니다. 런타임에 ContentBackground 속성은 사용자가 설정한 값으로 표시됩니다.

자세한 내용은 연습: 디자인 타임에 속성 동작 변경을 참조하십시오.



Imports System
Imports System.Windows                  'SystemColors
Imports System.Windows.Media            'SolidColorBrush
Imports System.Windows.Controls         'Button
Imports Microsoft.Windows.Design.Model  'DesignModeValueProvider
Imports Microsoft.Windows.Design.Metadata


Namespace CustomButton

    Public Class CustomButtonDesignModeValueProvider
        Inherits DesignModeValueProvider


        Public Sub New()
            Properties.Add(GetType(Button), "Content")
            Properties.Add(GetType(Button), "Background")
        End Sub



        Public Overrides Function TranslatePropertyValue( _
            ByVal item As ModelItem, _
            ByVal identifier As PropertyIdentifier, _
            ByVal value As Object) As Object

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Content" Then

                Return value.ToString().ToUpper()
            End If

            If identifier.DeclaringType Is GetType(Button) And _
               identifier.Name = "Background" Then

                Return New SolidColorBrush(SystemColors.ControlColor)
            End If

            Return MyBase.TranslatePropertyValue(item, identifier, value)
        End Function
    End Class
End Namespace


using System;
using System.Windows;                   //SystemColors
using System.Windows.Media;             //SolidColorBrush
using System.Windows.Controls;          //Button
using Microsoft.Windows.Design.Model;
using Microsoft.Windows.Design.Metadata;   //DesignModeValueProvider
namespace CustomButton
{
    class CustomButtonDesignModeValueProvider : DesignModeValueProvider
    {

        public CustomButtonDesignModeValueProvider()
        {
            Properties.Add( typeof(Button), "Content");
            Properties.Add(typeof(Button), "Background");
        }


        public override object TranslatePropertyValue(ModelItem item, PropertyIdentifier identifier, object value)
        {
            if (identifier.DeclaringType == typeof( Button ) &&
                identifier.Name == "Content" )
            {
                return ((string)value).ToUpper();
            }

            if (identifier.DeclaringType == typeof(Button) &&
                identifier.Name == "Background")
            {
                return new SolidColorBrush(SystemColors.ControlColor);
            }

            return base.TranslatePropertyValue(item, identifier, value);
        }
    }
}

스레드로부터의 안전성

이 형식의 모든 공용 static(Visual Basic의 경우 Shared) 멤버는 스레드로부터 안전합니다. 인터페이스 멤버는 스레드로부터 안전하지 않습니다.

참고 항목

참조

Microsoft.Windows.Design.Model 네임스페이스

기타 리소스

방법: 디자인 타임에 속성 동작 변경

WPF Designer 확장성 아키텍처

속성 편집 아키텍처

기능 공급자 및 기능 커넥터