변경 이벤트를 지원하는 WPF 종속성 속성 생성 코드 조각

Dev Tools/이벤트 코드 생성기 2008. 11. 21. 09:25


요즈음 WPF 공부를 성실하게 하다 보니 앞으로 종속성 속성을 빈번하게 만들 것 같다는 예감이 듭니다.

그래서 VS2005(2008)의 코드 조각 기능을 사용하여 반복적인 타이핑을 줄일 수 있는 코드 조각을 만들어 보았습니다.

사용 방법은 다음과 같습니다.

도구 -> 코드 조각 관리자를 실행합니다.

가져오기 버턴을 눌러 새로운 코드 조각을 가져옵니다.

첨부된 Dependency Property.snippet를 불러옵니다.

마침을 누르면 코드 조각이 추가됩니다.

추가된 코드 조각의 정보는 다음과 같습니다.

image

이 코드 조각을 사용하는 예를 볼까요?

종속성 속성을 가질 클래스를 추가합니다. 이름은 SecretButton으로 하겠습니다.

image

일반 버튼을 확장하여 비밀 텍스트를 추가로 가질 수 있는 버튼입니다.

비밀을 저장할 Secret 종속성 속성을 추가하겠습니다.

클래스 내부에서 dp라고 입력하고 탭키를 누릅니다.

image

(위 이미지에 생성된 코드의 일부입니다.)

현재 커서는 속성 이름을 변경하는 곳에 위치하고 있습니다. 속성 이름인 Secret를 입력하고 탭 키를 누릅니다.

이제 커서는 속성의 형식을 변경하는 곳에 있게 됩니다. 이번에는 string 라고 입력하고 탭 키를 누릅니다.

이번에는 속성의 기본값을 입력합니다. 여기서는 ""라고 입력합니다.

값을 편집하는 중에 기존 값을 변경하지 않으려면 그냥 탭 키만 누릅니다. 또한 엔터 키를 누르면 편집이 끝납니다.

 

위 예에서 생성된 전체 코드는 다음과 같습니다.

#region Secret dependency property things
/// <summary>
/// Identifies the Secret dependency property.
/// </summary>
public static readonly DependencyProperty SecretProperty =
    DependencyProperty.Register(
        "Secret", typeof(string), typeof(SecretButton),
        new FrameworkPropertyMetadata("", OnSecretChanged, OnSecretCoerced));

/// <summary>
/// Gets or sets the Secret assigned to the control.
/// </summary>
[Description("Gets or sets the Secret assigned to the control.")]
[DefaultValue("")]
public string Secret
{
    get { return (string)GetValue(SecretProperty); }
    set { SetValue(SecretProperty, value); }
}

private static object OnSecretCoerced(DependencyObject element, object value)
{
    string newValue = (string)value;
    SecretButton control = (SecretButton)element;

    //TODO : 여기에 커스텀 로직을 입력.

    return newValue;
}

private static void OnSecretChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
    SecretButton control = (SecretButton)obj;

    RoutedPropertyChangedEventArgs<string> e = new RoutedPropertyChangedEventArgs<string>(
        (string)args.OldValue, (string)args.NewValue, SecretChangedEvent);
    control.OnSecretChanged(e);
}

#region 라우팅된 SecretChanged 이벤트. UIElement를 상속하는 클래스만 유효
/// <summary>
/// Identifies the SecretChanged routed event.
/// </summary>
public static readonly RoutedEvent SecretChangedEvent = EventManager.RegisterRoutedEvent(
    "SecretChanged", RoutingStrategy.Bubble,
    typeof(RoutedPropertyChangedEventHandler<string>), typeof(SecretButton));

/// <summary>
/// Occurs when the Secret property changes.
/// </summary>
public event RoutedPropertyChangedEventHandler<string> SecretChanged
{
    add { AddHandler(SecretChangedEvent, value); }
    remove { RemoveHandler(SecretChangedEvent, value); }
}

/// <summary>
/// Raises the SecretChanged event.
/// </summary>
/// <param name="args">Arguments associated with the ValueChanged event.</param>
protected virtual void OnSecretChanged(RoutedPropertyChangedEventArgs<string> args)
{
    RaiseEvent(args);
}
#endregion
#endregion

: