사용자 지정 컨트롤의 디자인 타임 속성(Windows Forms .NET)

이 문서에서는 Visual Studio의 Windows Forms 비주얼 디자이너에서 컨트롤의 속성을 처리하는 방법에 대해 설명합니다.

모든 컨트롤은 다음과 같은 기본 클래스 System.Windows.Forms.Control에서 많은 속성을 상속합니다.

컨트롤을 만들 때 새 속성을 정의하고 해당 속성이 디자이너에 표시되는 방식을 제어할 수 있습니다.

Important

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

속성 정의

컨트롤에 의해 정의된 get 접근자가 있는 모든 공용 속성은 Visual Studio 속성 창에 자동으로 표시됩니다. 속성이 set 접근자도 정의하는 경우 속성 창에서 속성을 변경할 수 있습니다. 그러나 BrowsableAttribute를 적용하여 속성 창에서 속성을 명시적으로 표시하거나 숨길 수 있습니다. 이 특성은 표시 여부를 나타내는 단일 부울 매개 변수를 사용합니다. 특성에 대한 자세한 내용은 특성(C#) 또는 특성 개요(Visual Basic)를 참조하세요.

[Browsable(false)]
public bool IsSelected { get; set; }
<Browsable(False)>
Public Property IsSelected As Boolean

[참고] 문자열과 암시적으로 변환할 수 없는 복잡한 속성에는 형식 변환기가 필요합니다.

직렬화된 속성

컨트롤에 설정된 속성은 디자이너의 코드 숨김 파일로 직렬화됩니다. 이는 속성 값이 기본값이 아닌 다른 값으로 설정된 경우 발생합니다.

디자이너는 속성 변경을 검색하면 컨트롤의 모든 속성을 평가하고 값이 속성의 기본값과 일치하지 않는 모든 속성을 직렬화합니다. 속성 값은 디자이너의 코드 숨김 파일로 직렬화됩니다. 기본값은 디자이너가 직렬화해야 하는 속성 값을 결정하는 데 도움이 됩니다.

기본값

속성은 DefaultValueAttribute 특성을 적용하거나 속성의 클래스에 속성별 ResetShouldSerialize 메서드가 포함된 경우 기본값을 갖는 것으로 간주됩니다. 특성에 대한 자세한 내용은 특성(C#) 또는 특성 개요(Visual Basic)를 참조하세요.

기본값을 설정하면 다음을 사용하도록 설정할 수 있습니다.

  • 속성은 기본값에서 수정된 경우 속성 창에 시각적 표시를 제공합니다.
  • 사용자는 속성을 마우스 오른쪽 단추로 클릭하고 초기화를 선택하여 속성을 기본값으로 복원할 수 있습니다.
  • 디자이너는 보다 효율적인 코드를 생성합니다.

속성이 기본 형식과 같은 단순 형식을 사용하는 경우 속성에 DefaultValueAttribute를 적용하여 기본값을 설정할 수 있습니다. 그러나 이 특성이 있는 속성은 할당된 값으로 자동으로 시작되지 않습니다. 속성의 지원 필드를 동일한 기본값으로 설정해야 합니다. 선언이나 클래스 생성자에서 속성을 설정할 수 있습니다.

속성이 복합 형식이거나 디자이너의 초기화 및 serialization 동작을 제어하려는 경우 클래스에서 Reset<PropertyName>ShouldSerialize<PropertyName> 메서드를 정의합니다. 예를 들어, 컨트롤이 Age 속성을 정의하는 경우 메서드 이름은 ResetAgeShouldSerializeAge로 지정됩니다.

Important

속성에 DefaultValueAttribute를 적용하거나 Reset<PropertyName>ShouldSerialize<PropertyName> 메서드를 모두 제공합니다. 둘 다 사용하지 않습니다.

속성 이름을 마우스 오른쪽 단추로 클릭하고 초기화를 선택하면 속성 창을 통해 속성을 기본값으로 "초기화"할 수 있습니다.

속성 표의 초기화 바로 가기 메뉴 항목입니다.

다음과 같은 경우 속성>마우스 오른쪽 단추 클릭>초기화 바로 가기 메뉴 옵션을 사용할 수 있습니다.

  • 속성에 DefaultValueAttribute 특성이 적용되어 있고 속성 값이 특성 값과 일치하지 않습니다.
  • 속성의 클래스는 ShouldSerialize<PropertyName> 없이 Reset<PropertyName> 메서드를 정의합니다.
  • 속성의 클래스는 Reset<PropertyName> 메서드를 정의하고 ShouldSerialize<PropertyName>은 true를 반환합니다.

DefaultValueAttribute

속성 값이 DefaultValueAttribute에서 제공한 값과 일치하지 않으면 속성은 변경된 것으로 간주되며 속성 창을 통해 다시 설정할 수 있습니다.

Important

이 특성은 해당하는 Reset<PropertyName>ShouldSerialize<PropertyName> 메서드가 있는 속성에 사용하면 안 됩니다.

다음 코드는 기본값이 North인 열거형과 기본값이 10인 정수라는 두 가지 속성을 선언합니다.

[DefaultValue(typeof(Directions), "North")]
public Directions PointerDirection { get; set; } = Directions.North;

[DefaultValue(10)]
public int DistanceInFeet { get; set; } = 10;
<DefaultValue(GetType(Directions), "North")>
Public Property PointerDirection As Directions = Directions.North

<DefaultValue(10)>
Public Property DistanceInFeet As Integer = 10

Reset 및 ShouldSerialize

앞서 언급한 것처럼 Reset<PropertyName>ShouldSerialize<PropertyName> 메서드는 속성의 초기화 동작을 안내할 수 있을 뿐만 아니라 값이 변경되었는지 확인하고 디자이너의 코드 숨김 파일에 직렬화해야 하는지를 안내할 수 있는 기회를 제공합니다. 두 방법 모두 함께 작동하므로 다른 방법 없이 하나만 정의하면 안 됩니다.

Important

DefaultValueAttribute가 있는 속성에 대해 Reset<PropertyName>ShouldSerialize<PropertyName> 메서드를 만들면 안 됩니다.

Reset<PropertyName>이 정의되면 속성 창에 해당 속성에 대한 초기화 바로 가기 메뉴 옵션이 표시됩니다. 초기화를 선택하면 Reset<PropertyName> 메서드가 호출됩니다. 초기화 바로 가기 메뉴 옵션은 ShouldSerialize<PropertyName> 메서드에서 반환된 내용에 따라 사용 또는 사용하지 않도록 설정됩니다. ShouldSerialize<PropertyName>true를 반환하면 속성이 기본값에서 변경되었으며 코드 숨김 파일로 직렬화되어야 하며 초기화 바로 가기 메뉴 옵션을 사용하도록 설정해야 함을 나타냅니다. false가 반환되면 초기화 바로 가기 메뉴 옵션이 사용하지 않도록 설정되고 코드 숨김에서 속성 집합 코드가 제거됩니다.

두 메서드 모두 컨트롤의 공용 API를 구성하지 않도록 프라이빗 범위로 정의할 수 있고 정의해야 합니다.

다음 코드 조각은 Direction이라는 속성을 선언합니다. 이 속성의 디자이너 동작은 ResetDirectionShouldSerializeDirection 메서드로 제어됩니다.

public Directions Direction { get; set; } = Directions.None;

private void ResetDirection() =>
    Direction = Directions.None;

private bool ShouldSerializeDirection() =>
    Direction != Directions.None;
Public Property Direction As Directions = Directions.None

Private Sub ResetDirection()
    Direction = Directions.None
End Sub

Private Function ShouldSerializeDirection() As Boolean
    Return Direction <> Directions.None
End Function

형식 변환기

형식 변환기는 일반적으로 한 형식을 다른 형식으로 변환하는 동시에 속성 표 및 기타 디자인 타임 컨트롤에 대해 문자열을 값으로 변환하는 기능도 제공합니다. 문자열을 값으로 변환하면 복잡한 속성을 이러한 디자인 타임 컨트롤에 표시할 수 있습니다.

대부분의 기본 제공 데이터 형식(숫자, 열거형 등)에는 문자열을 값으로 변환하고 유효성 검사를 수행하는 기본 형식 변환기가 있습니다. 기본 형식 변환기는 System.ComponentModel 네임스페이스에 있으며 변환되는 형식의 이름을 따서 명명됩니다. 변환기 형식 이름은 {type name}Converter 형식을 사용합니다. 예: StringConverter, TimeSpanConverter, Int32Converter

형식 변환기는 디자인 타임에 속성 창에서 광범위하게 사용됩니다. TypeConverterAttribute를 사용하여 형식 변환기를 속성이나 형식에 적용할 수 있습니다.

속성 창에서는 속성에 대해 TypeConverterAttribute가 선언될 때 변환기를 사용하여 속성을 문자열 값으로 표시합니다. 형식에 대해 TypeConverterAttribute가 선언되면 속성 창은 해당 형식의 모든 속성에 대해 변환기를 사용합니다. 형식 변환기는 디자이너의 코드 숨김 파일에서 속성 값을 직렬화하는 데도 도움이 됩니다.

형식 편집기

속성 창은 속성 형식이 기본 제공 형식이거나 알려진 형식인 경우 속성에 대한 형식 편집기를 자동으로 사용합니다. 예를 들어, 부울 값은 TrueFalse 값이 있는 콤보 상자로 편집되고 DateTime 형식은 달력 드롭다운을 사용합니다.

Important

.NET Framework 이후 사용자 지정 형식 편집기가 변경되었습니다. 자세한 내용은 .NET Framework(Windows Forms .NET) 이후 디자이너 변경 내용을 참조하세요.