2010-07-18 9 views
3

요소 속성 구문과 속성 속성 구문에는 큰 의미상의 차이가 없다고 생각했습니다. 그러나, 나는 약간의 차이가 있어야한다는 것을 알았다.요소 속성 구문과 속성 속성 구문간에 의미있는 차이점이 있습니까?

예. 내가 트리거의 재산 Property에 대한 요소 속성 구문을 사용하는 경우, 그것은 그 세터를 말하는 예외가 발생

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Button><Button.Template> 
    <ControlTemplate TargetType="{x:Type Button}"> 
    <TextBlock x:Name="hello" Text="Hello" /> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="Foreground" Value="Red" TargetName="hello"/> 
    </Trigger> 
    </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Button.Template></Button> 
</Page> 

: 다음 예는 단순한 트리거를 보여줍니다! (트리거가 아님) 속성과 값이 모두 필요합니다.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<Button><Button.Template> 
    <ControlTemplate TargetType="{x:Type Button}"> 
    <TextBlock x:Name="hello" Text="Hello" /> 
    <ControlTemplate.Triggers> 
     <Trigger Value="True"> 
     <Trigger.Property>IsMouseOver</Trigger.Property> 
     <Setter Property="Foreground" Value="Red" TargetName="hello"/> 
    </Trigger> 
    </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Button.Template></Button> 
</Page> 

그래서, 요소 속성 구문과 속성 구문 속성 사이의 숨겨진 차이점은 무엇입니까?

답변

2

차이가 없어야합니다. 난 당신이 방금 XAML 파서에 버그를 발견했다고 생각합니다.

프레임 워크에는 Setter, Trigger 및 Condition에 대한 특수 처리가 있습니다. 리플렉터가있는 Trigger.ReceiveTypeConverter을 확인하십시오. 리플렉터는 Value 및 Property 속성에 대한 속성 설정자 처리를 재정의합니다. 이 속성 속성을 기반으로 다른 형식으로 값 속성을 구문 분석 할 수 있도록 생각합니다. 예를 들어 Property가 Foreground이고 Foreground가 Brush 유형 인 경우 String이 아닌 "Red"를 브러시로 구문 분석합니다.

후크가 트리거 내에서 Value 또는 Property라는 모든 속성 집합을 재정의하지만 요소 속성 구문을 올바르게 처리하지 못하는 것처럼 보입니다. 효과를 보려면,이 같은 태그 확장 만들어보십시오 :

public class Test 
    : MarkupExtension 
{ 
    public DependencyProperty Property { get; set; } 
    public DependencyProperty Property2 { get; set; } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return Property ?? Property2; 
    } 
} 

은 다음 XAML은 두 번째 예와 같은 오류를 얻을 것이다, 당신은 속성이 설정되지 않습니다 것을 중단 점 설정하여 확인할 수 있습니다

을 이 속성 구문을 사용하기 때문에,

<Trigger.Property> 
    <local:Test> 
     <local:Test.Property2>IsMouseOver</local:Test.Property2> 
    </local:Test> 
</Trigger.Property> 

을 그리고 이것은 작동합니다 :

<Trigger.Property> 
    <local:Test> 
     <local:Test.Property>IsMouseOver</local:Test.Property> 
    </local:Test> 
</Trigger.Property> 

그러나 속성이 "속성"라는되지 않기 때문에이 작동합니다

을 "속성"가 아닌 다른 유형의 DependencyProperty에 이름이 뭔가의 속성을 가진 MarkupExtension을 만들고, ProvideValue에 그 반환 : 당신이 정말로 요소 속성 구문을 사용해야하는 경우
<Trigger.Property> 
    <local:Test Property="IsMouseOver"/> 
</Trigger.Property> 

, 즉 당신에게 해결 방법을 제공 할 것입니다.