2012-04-23 2 views
1

true로 설정된 경우 Adorner를 DependencyObject에 추가하는 부울 DependencyProperty를 구현하고 있습니다. DependencyProperty의 기본값을 true로 설정하고 PropertyChangedCallback을 실행하지 않으므로 기본값으로 adorner가 만들어지지 않습니다. 초기화시 PropertyChangedCallback을 실행하는 방법이 있습니까?커스텀 DependencyProperty의 PropertyChangedCallback on initialize

public static bool GetIsAdorned(DependencyObject obj) 
{ 
    return (bool)obj.GetValue(IsAdornedProperty); 
} 

public static void SetIsAdorned(DependencyObject obj, bool value) 
{ 
    obj.SetValue(IsAdornedProperty, value); 
} 

public static readonly DependencyProperty IsAdornedProperty = 
     DependencyProperty.RegisterAttached("IsAdorned", 
     typeof(bool), 
     typeof(UIElement), 
     new UIPropertyMetadata(true, OnIsAdornedChanged)); 

private static void OnIsAdornedChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) 
{ 
    var uiElement = dependencyObject as UIElement; 
    var newValue = (bool)e.NewValue; 
    var adornerLayer = AdornerLayer.GetAdornerLayer(uiElement); 

    if (newValue) 
    { 
     adornerLayer.Add(new MyAdorner(uiElement)); 
    } 
} 
+1

참고 사항 : [사용자 지정 연결된 속성] (http://msdn.microsoft.com/en-us/library/ms749011.aspx#custom)을 만들 때 RegisterAttached의 * ownerType * 매개 변수는 클래스 여야합니다 이 속성을 정의 할 때 ** 속성을 적용 할 클래스가 아니라 ** (여기서는 UIElement가 아님). 그렇지 않으면 XAML에서 속성을 적용 할 수 없습니다. – Clemens

+0

필자는 문서의 예제에 DependencyProperty가 정의 된 클래스가 표시되지 않으므로 ownerType이 무엇으로 설정되었는지 명확하지 않았기 때문에 항상 궁금해했습니다. 이상한 것은 속성을 적용하고자하는 클래스에 ownerType 매개 변수를 설정했는데 문제가 발생하지 않았으며 XAML에서 속성을 설정할 수 있다는 점에서 이미 몇 가지 동작이 있다는 것입니다. 코드를 살펴보고 수정해야합니다. Clemens에게 감사드립니다! –

답변

2

값 상속을 지원하는 첨부 된 속성을 제외하고는 트리의 모든 요소에 자동으로 적용되는 기본값이 없습니다.

사용자가 명시 적으로 해당 속성을 설정하지 않으면 정상적인 연결된 속성 (상속 없음)의 값이 모든 요소에 적용되지 않습니다. 속성이 요소에 명시 적으로 설정되지 않은 경우 연결된 속성의 값을 가져 오는 것은 메타 데이터에서 기본값을 반환합니다.

예를 들어 Canvas.Left을 설정하지 않고 Canvas에 요소가있는 경우 Canvas는 메타 데이터에서 Canvas.Left의 기본값을 0으로받습니다. 요소 자체는 단순히이 값을 갖지 않습니다.

어쨌든 IsAdorned을 적용해야하므로 기본값은 false이어야합니다.

관련 문제