2010-10-26 27 views
5
<Border Name="ItemBorder" Margin="5 5 0 5" BorderBrush="Black" BorderThickness="1" Height="75" Width="75"> 
    <Border.Background> 
    <SolidColorBrush x:Name="ItemBorderBrush" Color="LightBlue"/> 
    </Border.Background> 
    <ContentPresenter/> 
</Border> 
<ControlTemplate.Triggers> 
    <EventTrigger RoutedEvent="someEvent"> 
    <BeginStoryboard> 
     <Storyboard TargetName="ItemBorderBrush" TargetProperty="Color" Duration="0:0:1" > 
     <!--Storyboard TargetName="ItemBorder" TargetProperty="Background.Color" Duration="0:0:1"> --> 
     <ColorAnimation To="White"/> 
     </Storyboard> 
    </BeginStoryboard> 
    </EventTrigger> 
</ControlTemplate.Triggers> 

Je vais essayer d'expliquer clairement ma question. Le nom de la cible de Storyboard, lorsqu'il s'agit de "ItemBorder" (la ligne commentée) fonctionne par intermittence. Parfois, j'obtiens une erreur que le nom "ItemBorder" ne peut pas être trouvé dans la portée. J'ai décidé de suivre un style à partir d'un exemple MSDN, et de changer la propriété de couleur directement sur le pinceau, au lieu d'avoir la cible du storyboard comme bordure et de changer la couleur de la bordure par propriété (la ligne commentée). Cela semble fonctionner.Quelle est la signification de x: Nom dans xaml (WPF) et son utilisation avec Storyboard

Cependant, Name="ItemBorderBrush" ne compile pas parce que Name n'est pas une propriété de SolidColorBrush donc j'utilise x:Name="ItemBorderBrush" deux Name et x:Name sont acceptés pour la frontière. Pourquoi est-ce?

Que signifie le x: signifie (comment est-x:Name différent de Name), et pourquoi le fait d'avoir la propriété Name de frontière ne fonctionne avec le story-board parfois?

+0

voir aussi [En WPF, quelles sont les différences entre les x: Nom et attributs de nom] (http://stackoverflow.com/questions/589874/in-wpf-what-are- the-differences-between-the-xname-and-name-attributs) –

Répondre

4

Le préfixe x: met simplement un attribut d'un séparé namespace:

Dans les déclarations d'espace de noms dans la balise racine de nombreux fichiers XAML, vous verrez qu'il ya généralement deux déclarations d'espace de noms XML . La première déclaration mappe l'espace de noms global client WPF /cadre XAML comme la valeur par défaut:

xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"

La deuxième déclaration mappe un espace de noms XAML distinct, le mappant (généralement) au préfixe x:.

xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml"

La relation entre ces déclarations est que le x: préfixe cartographie supporte les intrinsèques qui font partie de la définition du langage XAML , et WPF est une implémentation qui utilise XAML comme langage et définit un vocabulaire de ses objets pour XAML. Parce que les usages de vocabulaire WPF seront beaucoup plus commun que les XAML intrinsics usages, le vocabulaire WPF est mappé comme la valeur par défaut

Ainsi, la raison pour laquelle Name et x:Name travaillent tous les deux à la frontière est parce que la frontière a une propriété appelée Name. Il prend également en charge l'utilisation de XAML Intrinsic de x:Name (ce que WPF utilise pour créer l'instance nommée de la classe).

Toutefois, SolidColorBrush n'a pas la propriété appelée Nom, de sorte qu'il prend uniquement en charge l'utilisation intrinsèque XAML de x:Name.

1

Il n'y a vraiment qu'un seul nom en XAML, le x: Name.Un framework, tel que WPF, peut éventuellement mapper une de ses propriétés à x: Name en utilisant le RuntimeNamePropertyAttribute de la classe qui désigne l'une des propriétés des classes comme mappage avec l'attribut x: Name de XAML.

La raison pour laquelle cela a été fait était de permettre les frameworks qui ont déjà un concept de "Name" à l'exécution, tel que WPF. Dans WPF, par exemple, FrameworkElement introduit une propriété Name.

En général, une classe n'a pas besoin de stocker le nom de x: Name pour pouvoir être utilisé. Tout x: Nom signifie que XAML génère un champ pour stocker la valeur dans le code derrière la classe. Ce que fait le moteur d'exécution avec ce mappage dépend du framework. Alors, pourquoi y a-t-il deux façons de faire la même chose? La réponse simple parce qu'il y a deux concepts mappés sur une propriété. WPF veut que le nom d'un élément soit préservé à l'exécution (ce qui est utilisable via Bind, entre autres) et XAML doit savoir quels éléments vous voulez être accessible par les champs dans le code derrière la classe. WPF lie ces deux ensemble en marquant la propriété Name comme un alias de x: Name. A l'avenir, XAML aura plus d'utilisations pour x: Name, par exemple pour vous permettre de définir des propriétés en faisant référence à d'autres objets par leur nom, mais en 3.5 et avant, il est uniquement utilisé pour créer des champs. Que vous utilisiez l'un ou l'autre est vraiment une question de style, pas une question technique. Je laisserai cela à d'autres pour une recommandation. Voir aussi AutomationProperties.Name VS x: Name, AutomationProperties.Name est utilisé par les outils d'accessibilité et certains outils de test.

se réfèrent In WPF, what are the differences between the x:Name and Name attributes?