2010-04-22 2 views
1

System.Windows.Documents 클래스의 클래스를 사용하여 특정 종속성 속성의 값을 조건부로 설정하는 일부 일반 코드를 작성하려고합니다. 이러한 특성이 주어진 클래스에 존재하는지 여부.종속성 개체가 특정 종속성 속성 (C#/WPF)을 구현하는지 여부를 확인하는 방법

예를 들어, 이하의 방법이 통과 FrameworkContentElementPadding 속성에 임의의 값을 대입하지 FrameworkContentElement 모든 구체적인 구현은 Padding 속성을 가지고, 그러나

void SetElementPadding(FrameworkContentElement element) 
{ 
    element.SetValue(Block.PaddingProperty, new Thickness(155d)); 
} 

(Paragraph는 않지만 Span가 수행되지 않음) 그래서이 속성을 구현하는 유형에 대해서는 속성 할당이 성공하고 그렇지 않은 경우에는 자동으로 무시 될 것으로 예상됩니다.

그러나 위의 속성 할당은 Padding 속성을 구현하는지 여부에 관계없이 모든 파생물이 FrameworkContentElement 인 경우 성공합니다. 내가 항상 할당 된 값을 다시 읽을 수 있었기 때문에 나는이 가정을한다.

속성 값을 할당하는 방식에 결함이 있다고 가정합니다. 해당 속성을 구현하지 않은 클래스가 특정 종속성 속성 할당을 무시하도록하려면 어떻게해야합니까?

귀하의 조언에 많은 시간을드립니다.

답변

1

Block에서 파생 된 모든 클래스에는 Padding 속성이 있습니다. 당신이 원하는 모든 패딩을 지원하지 않는 클래스에 의해 무시하기 때문에 여전히 당신을 위해 일하는 것이 비록이 수정의 모든없이

void SetElementPadding(FrameworkContentElement element) 
{ 
    var block = element as Block; 
    if (block == null) return; 

    block.Padding = new Thickness(155d); 
} 

다음과 같은 수정을 사용할 수 있습니다. 이것은 정확히 일어날 것입니다. 당신이 그것을 지원하지 않는 인스턴스에서 Padding 의존성 프로퍼티의 값을 읽을 수 있다는 사실은 아마도 의도적 인 것이지만 당신은 신경 쓰지 말아야합니다. 블록과 파생 상품은 가치를 존중하고 다른 모든 사람들은 가치를 무시합니다.

+0

답변 해 주셔서 감사합니다. FrameworkContentElement에서 파생 된 23 가지 유형 중 하나에서 작동 할 수있는 여러 가지 메소드가 있으므로 유형별 코드 (예 : 인스턴스가 블록인지 테스트)를 피하기를 바랬습니다. 이것은 BorderThickness와 같은 속성에서 특히 중요합니다. BorderThickness는 4 가지 유형으로 독립적으로 구현됩니다. 그럼에도 불구하고, 지원되지 않는 속성에 대한 귀하의 관찰은 무시해 주므로 매우 유용합니다. 즉, 내 메서드가 암시 적으로 결과가 결정되도록 최소를 수행 할 수 있음을 의미합니다. 다시 한번 감사드립니다. –

+0

또 다른 접근법은 Reflection을 사용하고'Padding' 또는'BorderThickness' 속성이 존재 하는지를 명시 적으로 확인하는 것입니다. – wpfwannabe