Dans WPF, quelles sont les différences entre les attributs x:Name et Name?

Le titre dit tout. Il semble parfois que les attributs Name et x:Name soient interchangeables.

alors, quelles sont les différences définitives entre eux, et quand est-il préférable d'utiliser l'un par rapport à l'autre?

y a-t-il des implications de performance ou de mémoire à les utiliser de la mauvaise façon?

501
demandé sur Drew Noakes 2009-02-26 12:53:21

14 réponses

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

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

En général, une classe n'a pas besoin de stocker le nom de x:Name pour être utilisable. Tout ce que x:Name signifie pour XAML est de générer un champ pour stocker la valeur dans le code derrière class. Ce que fait le runtime avec ce mapping dépend du framework.

Alors, pourquoi il y a deux façons de faire la même chose? La réponse est simple: il y a deux concepts sur une même propriété. WPF veut le nom d'un élément préservé à l'exécution (qui est utilisable grâce à Bind, entre autres choses) et XAML a besoin de savoir quels éléments vous voulez être accessibles par des champs dans le code derrière la classe. La WPF les relie en marquant la propriété Name comme alias de x: Name.

dans le futur, XAML aura plus d'utilisations pour x:Name, comme vous permettre de définir des propriétés en se référant à d'autres objets par nom, mais en 3.5 et avant, il est seulement utilisé pour créer des champs.

Si vous devez utiliser l'un ou l'autre est c'est une question de style, Pas technique. Je laisse cela à d'autres pour une recommandation.

Voir aussi AutomationProperties.Nom VS x: Nom , propriétés D'automatisation.Le nom est utilisé par les outils d'accessibilité et certains outils d'essai.

432
répondu chuckj 2018-03-15 19:49:53

Ils ne sont pas la même chose.

x:Name est un concept xaml, utilisé principalement pour des éléments de référence. Lorsque vous donnez à un élément l'attribut x:Name xaml, "le x:Name spécifié devient le nom d'un champ qui est créé dans le code sous-jacent lorsque xaml est traité, et ce champ contient une référence à l'objet."( MSDN ) donc, c'est un champ généré par le concepteur, qui a un accès interne par défaut.

Name est la propriété de chaîne de caractères existante d'un FrameworkElement , listée comme toute autre propriété d'élément wpf sous la forme d'un attribut xaml.

par conséquent, cela signifie également que x:Name peut être utilisé sur un plus grand nombre d'objets. C'est une technique pour permettre à tout ce qui est dans xaml d'être référencé par un prénom.

73
répondu Kenan E. K. 2014-07-25 20:16:05

x: nom et nom font référence à des espaces de noms différents.

x:le nom est une référence à l'espace de noms x défini par défaut en haut du fichier Xaml.

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

il suffit de dire Nom utilise la valeur par défaut ci-dessous de l'espace de noms.

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

x:le nom signifie utiliser l'Espace-nom qui a le x alias. x est la valeur par défaut et la plupart des gens laisser, mais vous pouvez changer ce que vous voulez

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

donc votre référence serait foo: nom

définir et utiliser les espaces de noms dans WPF


OK voyons cela d'une manière différente. Dites que vous faites glisser et déposez un bouton sur votre page Xaml. Vous pouvez faire référence à ce 2 façons x: nom et nom . Tous xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation " et xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" sont des références à plusieurs espaces de noms. Depuis xaml détient le contrôle espace de nom (pas 100% Sur cela) et présentation détient le cadrage et le La classe de boutons a un motif d'héritage de:

Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement, 
                    IInputElement, ISupportInitialize, IHaveResources

de sorte que l'on s'attendrait à ce que tout ce qui hérite de Cadrekelement aurait accès à tous ses attributs publics. donc dans le cas de bouton il obtient son attribut de nom de Cadrekelement, au sommet de l'arbre de la hiérarchie. Donc , vous pouvez dire x:Name ou Nom et ils seront tous deux accès à la lecture/définition de le FrameworkElement.

Référence MSDN

WPF définit un attribut CLR qui est consommé par les processeurs XAML afin de mapper plusieurs espaces de noms CLR vers un seul espace de noms XML. L'attribut XmlnsDefinitionAttribute est placé au niveau de l'assemblage dans le code source qui produit l'assemblage. Le code source de l'Assemblée WPF utilise cet attribut pour cartographier les différents espaces de noms communs, tels que Système.Windows et le Système.Windows.Commandes, au http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.

ainsi les attributs d'Assemblée ressembleront à quelque chose comme:

cadre de présentation.dll - xmlnsdefinitionattribute:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Data")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Navigation")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Shapes")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Documents")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Controls")]  
31
répondu cgreeno 2018-03-15 19:51:10

ils sont tous les deux la même chose, beaucoup d'éléments de cadre exposent une propriété de nom eux - mêmes, mais pour ceux qui ne peuvent pas vous pouvez utiliser x:name-je reste habituellement avec x:name parce que cela fonctionne pour tout.

les contrôles peuvent exposer le nom eux-mêmes comme une propriété de dépendance s'ils le veulent (parce qu'ils ont besoin d'utiliser cette propriété de dépendance en interne), ou ils peuvent choisir de ne pas le faire.

plus de détails dans msdn ici et ici :

Certains framework WPF au niveau des applications peut-être en mesure d'éviter toute utilisation de l' x: attribut Name, parce que le nom propriété de dépendance telle que spécifiée dans l'espace de noms du FPF pour plusieurs des classes de base importantes telles que Encadrement / Cadrecontentelement répond à ce même but. Il y a encore quelques XAML et cadre commun scénarios où l'accès au code élément sans nom propriété est nécessaire, notamment dans certains soutien à l'animation et au scénario-maquette classe. Par exemple, vous devez spécifiez x: nom sur les délais et transforme créé dans XAML, si vous l'intention de les référencer à partir du code.

si le nom est disponible comme bien sur la classe, le nom et le x: Nom peuvent être utilisés interchangeables en tant qu'attributs, mais un erreur se produit si les deux sont spécifié sur le même élément.

19
répondu Steven Robbins 2018-03-15 19:52:35

X: le nom peut causer des problèmes de mémoire si vous avez des commandes personnalisées. Il gardera un emplacement de mémoire pour l'entrée de NameScope.

je dis n'utilisez jamais x: Name sauf si vous devez.

9
répondu scott 2011-01-13 18:57:33

la seule différence est que si vous utilisez des commandes utilisateur dans une commande de la même Assemblée, alors le nom n'identifiera pas votre commande et vous obtiendrez une erreur"utiliser x:nom pour les commandes dans la même Assemblée". So x: nom est la version de WPF des contrôles de nommage dans WPF. Nom est juste utilisé comme un héritage Winform. Ils ont voulu différencier le nom des contrôles dans WPF et winforms car ils utilisent des attributs dans Xaml pour identifier les contrôles d'autres assemblées ils ont utilisé x: pour les noms de contrôle.

il suffit de garder à l'esprit dont mettre un nom pour un contrôle juste pour le plaisir de le garder comme il réside dans la mémoire comme un blanc et il vous donnera un avertissement que le nom a été appliqué pour un contrôle mais son jamais utilisé.

7
répondu Bipul Kumar 2013-01-17 18:03:57

Nom :

  1. ne peut être utilisé que pour les descendants de Cadrorkelement et Cadrorkcontentelement;
  2. peut être défini à partir de code-behind via SetValue() et de propriétés-like.

x: Name :

  1. peut être utilisé pour presque tous les éléments XAML;
  2. ne peut pas être réglé de code-behind via SetValue(); il ne peut être défini en utilisant l'attribut syntaxe sur les objets car il s'agit d'une directive.

L'utilisation des deux directives dans XAML pour un framework-Content ou Framework-ContentElement provoquera une exception: si XAML est compilé, l'exception se produira sur la compilation du markup, sinon elle se produira sur la charge.

7
répondu Alexander Zolotaryov 2013-08-27 17:12:05

x:Name signifie: créer un champ dans le code derrière pour contenir une référence à cet objet.

Name signifie: définir la propriété du nom de cet objet.

5
répondu BIBIN K ONANKUNJU 2017-01-12 07:15:04

j'utilise toujours la variante x:Name. Je n'ai aucune idée si cela affecte les performances, je trouve qu'il est plus facile pour la raison suivante. Si vous avez vos propres usercontrols qui résident dans une autre assemblée, juste la propriété "Name" ne suffira pas toujours. Cela rend plus facile de coller trop la propriété x: Name.

4
répondu Simon 2009-02-26 09:56:56

ce n'est pas un élément WPF mais un XML standard et BtBh a correctement répondu, x se réfère à l'espace de nom par défaut. En XML quand vous ne préfixez pas un élément/attribut avec un espace de noms, il suppose que vous voulez l'espace de noms par défaut. Donc taper juste Name n'est rien de plus qu'une petite main pour x:Name . Plus de détails sur les espaces de noms XML peuvent être trouvés à link text

3
répondu Robert MacLean 2017-05-23 10:31:20

L'une des réponses est que x:name doit être utilisé dans différentes langues de programme telles que c# et name doit être utilisé pour le framework. Honnêtement, c'est ce que ça ressemble pour moi.

2
répondu daddycardona 2013-11-15 05:49:48

lorsque vous déclarez un élément bouton dans XAML, vous vous référez à une classe définie dans windows run time appelée Button.

Le bouton

a plusieurs attributs tels que le fond, le texte, la marge, ..... et un attribut appelé nom.

maintenant quand vous déclarez un bouton dans XAML est comme créer un objet anonyme qui s'est avéré avoir un attribut appelé nom.

en général, vous ne pouvez pas vous référer à un objet anonyme, mais dans WPF le processeur framework XAML vous permet de vous référer à cet objet par n'importe quelle valeur que vous avez donnée à l'attribut Name.

pour l'instant tout va bien.

une autre façon de créer un objet est de créer un objet nommé au lieu d'un objet anonyme. Dans ce cas, XAML namespace a un attribut pour un objet appelé Name (et puisqu'il est dans L'espace de nom XAML ont donc X:) que vous pouvez définir de sorte que vous pouvez identifier votre objet et se référer à elle.

Conclusion:

Name est un attribut d'un objet spécifique, mais X: Name est un attribut de cet objet (il existe une classe qui définit un objet général).

2
répondu RockyMan Rocky 2015-08-24 02:10:55

le X:Nom devient le nom d'un champ qui est créé dans le code sous-jacent lors du traitement de XAML, et ce champ contient une référence à l'objet. Dans Silverlight, en utilisant L'API gérée, le processus de création de ce champ est effectué par les étapes cibles de MSBuild, qui sont également responsables de joindre les classes partielles pour un fichier XAML et son code-behind. Ce comportement n'est pas nécessairement XAML langue spécifiée; c'est le particulier mise en œuvre que Silverlight s'applique à utiliser x:Nom dans ses modèles de programmation et d'application.

pour en savoir plus sur MSDN...

1
répondu Edd 2015-04-29 15:47:29

Ma recherche est x:Name comme global à la variable. Toutefois, Name comme variable locale . Est-ce que cela signifie x:Name vous pouvez l'appeler n'importe où dans votre fichier XAML mais le nom ne l'est pas.

Exemple:

<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />

Vous ne pouvez pas Binding propriété Content de Button avec le Nom "btn", car en dehors de StackPanel

0
répondu Phuc Hoang 2018-06-15 12:36:51