2010-07-18 4 views
3

Je pensais que la syntaxe de propriété d'élément et la syntaxe de propriété d'attribut n'ont pas de grande différence sémantique. Cependant, j'ai trouvé qu'il devait y avoir une différence.Y a-t-il une différence sémantique entre la syntaxe de propriété d'élément et la syntaxe de propriété atrribute?

E.g. L'exemple suivant montre juste un déclencheur simple:

<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> 

Cependant, si j'utilisé une syntaxe de propriétés d'élément pour la propriété Property de déclenchement, il lance une exception en disant que setter! (pas trigger) nécessite à la fois la propriété et la valeur.

<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> 

Alors, quel est le caché différence entre la syntaxe de la propriété d'éléments et syntaxe d'attribut de propriété?

Répondre

2

Il ne devrait pas y avoir de différence. Je pense que vous venez de trouver un bogue dans l'analyseur XAML.

La structure a une manipulation spéciale pour Setter, Trigger et Condition. Consultez Trigger.ReceiveTypeConverter avec Reflector, qui remplace la gestion des paramètres de propriété pour les propriétés Value et Property. Je pense que c'est pour pouvoir analyser la propriété Value avec un type différent basé sur la propriété Property. Par exemple, il analyse "Rouge" comme un pinceau plutôt que comme une chaîne lorsqu'il voit que la propriété est au premier plan et que le premier plan est de type pinceau.

Il semblerait que ce hook écrase tous les ensembles de propriétés nommés Value ou Property dans un trigger, mais qu'il ne gère pas correctement la syntaxe de la propriété element. Pour voir l'effet, essayez de créer une extension de balisage comme ceci:

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

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

Le XAML suivant va obtenir la même erreur que votre deuxième exemple, et vous pouvez vérifier en mettant un point d'arrêt que la propriété est jamais définie:

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

Cependant, cela fonctionnera, parce que la propriété est pas nommé « propriété »:

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

Et cela fonctionne, car il utilise la syntaxe d'attribut:

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

Si vous avez vraiment besoin d'utiliser l'élément syntaxe de la propriété, qui vous donnera une solution de contournement: créer un MarkupExtension qui a une propriété de type DependencyProperty quelque chose du nom autre que « la propriété », et le retour que ProvideValue.

Questions connexes