변경 이벤트를 지원하는 WPF 종속성 속성 생성 코드 조각
Dev Tools/이벤트 코드 생성기 2008. 11. 21. 09:25요즈음 WPF 공부를 성실하게 하다 보니 앞으로 종속성 속성을 빈번하게 만들 것 같다는 예감이 듭니다.
그래서 VS2005(2008)의 코드 조각 기능을 사용하여 반복적인 타이핑을 줄일 수 있는 코드 조각을 만들어 보았습니다.
사용 방법은 다음과 같습니다.
도구 -> 코드 조각 관리자를 실행합니다.
가져오기 버턴을 눌러 새로운 코드 조각을 가져옵니다.
첨부된 Dependency Property.snippet를 불러옵니다.
마침을 누르면 코드 조각이 추가됩니다.
추가된 코드 조각의 정보는 다음과 같습니다.
이 코드 조각을 사용하는 예를 볼까요?
종속성 속성을 가질 클래스를 추가합니다. 이름은 SecretButton으로 하겠습니다.
일반 버튼을 확장하여 비밀 텍스트를 추가로 가질 수 있는 버튼입니다.
비밀을 저장할 Secret 종속성 속성을 추가하겠습니다.
클래스 내부에서 dp라고 입력하고 탭키를 누릅니다.
(위 이미지에 생성된 코드의 일부입니다.)
현재 커서는 속성 이름을 변경하는 곳에 위치하고 있습니다. 속성 이름인 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