Le titre dit tout. Parfois, il semble 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 sur l'autre?
Y a-t-il des implications en termes de performances ou de mémoire dans leur mauvaise utilisation?
.net
wpf
xaml
name-attribute
Drew Noakes
la source
la source
x:Name
tout le temps fonctionne bien. Je viens de devoir le changerName
sinon je ne pourrais pas référencer le contrôle dans mon code .xaml.cs donc je vais supposer que ce n'est plus le cas qu'il fonctionne bien tout le temps.Réponses:
Il n'y a vraiment qu'un seul nom en XAML, le
x:Name
. Un framework, tel que WPF, peut éventuellement mapper l'une de ses propriétés aux XAMLx:Name
en utilisantRuntimeNamePropertyAttribute
la classe sur qui désigne l'une des propriétés des classes comme mappant à l'attribut x: Name de XAML.La raison pour laquelle cela a été fait était de permettre des frameworks qui ont déjà un concept de "Nom" au moment de l'exécution, comme 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 pour
x:Name
être utilisable. Toutx:Name
moyen pour XAML est de générer un champ pour stocker la valeur dans le code derrière la classe. Ce que le runtime fait 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 est qu'il existe deux concepts mappés sur une propriété. WPF veut que le nom d'un élément soit conservé au moment de l'exécution (qui est utilisable entre autres par Bind) et XAML doit savoir quels éléments vous voulez être accessibles par les champs dans le code derrière la classe. WPF relie ces deux éléments en marquant la propriété Name comme un alias de x: Name.
À l'avenir, XAML aura plus d'utilisations pour x: Name, comme vous permettant de définir des propriétés en faisant référence à d'autres objets par leur nom, mais dans les versions 3.5 et antérieures, il n'est utilisé que pour créer des champs.
Que vous deviez utiliser 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.
la source
x:Name
carName
ne créerait pas de champ à reconnaître en code-behind. Je ne sais toujours pas pourquoi cela se produit, cependant.Name
propriété, cela signifie la même chose. Si l'élément n'a pas deName
propriété, vous devez utiliserx:Name
.Ce n'est pas la même chose.
x:Name
est un concept xaml, utilisé principalement pour référencer des éléments. Lorsque vous attribuez à un élément l'attribut x: Name xaml, "le spécifiéx:Name
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 ) Il s'agit donc d'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 existante de aFrameworkElement
, répertoriée comme toute autre propriété d'élément wpf sous la forme d'un attribut xaml.En conséquence, cela signifie également qu'il
x:Name
peut être utilisé sur une plus large gamme d'objets. Il s'agit d'une technique pour permettre à tout élément de xaml d'être référencé par un nom donné.la source
x: Nom et Nom font référence à des espaces de noms différents.
x: nom est une référence à l'espace de noms x défini par défaut en haut du fichier Xaml.
Dire simplement que Name utilise l'espace de noms par défaut ci-dessous.
x: Nom signifie utiliser l'espace de noms qui a le x alias . x est la valeur par défaut et la plupart des gens la quittent, mais vous pouvez la changer en ce que vous voulez
donc votre référence serait foo: nom
Définir et utiliser des espaces de noms dans WPF
OK, regardons cela différemment. Supposons que vous glissiez et déposiez un bouton sur votre page Xaml. Vous pouvez référencer ce 2 façons x: nom et nom . Tous les 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 . Étant donné que xaml contient l' espace de noms Control (pas 100% sur cela) et la présentation contient FrameworkElement ET la classe Button a un modèle d'héritage de:
Donc, comme on pourrait s'y attendre, tout ce qui hérite de FrameworkElement aurait accès à tous ses attributs publics. ainsi, dans le cas de Button, il obtient son attribut Name de FrameworkElement, tout en haut de l'arborescence de la hiérarchie. Ainsi , vous pouvez dire x: Nom ou nom et ils seront à la fois être l' accès au getter / setter de la FrameworkElement.
Référence MSDN
WPF définit un attribut CLR utilisé par les processeurs XAML afin de mapper plusieurs espaces de noms CLR à un seul espace de noms XML. L' attribut XmlnsDefinitionAttribute est placé au niveau de l'assembly dans le code source qui produit l'assembly. Le code source de l'assembly WPF utilise cet attribut pour mapper les divers espaces de noms courants, tels que System.Windows et System.Windows.Controls, à la espace de noms http://schemas.microsoft.com/winfx/2006/xaml/presentation .
Ainsi, les attributs d'assemblage ressembleront à:
PresentationFramework.dll - XmlnsDefinitionAttribute:
la source
http://schemas.microsoft.com/winfx/2006/xaml
détientControl
puisque vous pouvez l' utiliser directement dans XAML sans espace de noms « x »:<Control />
Ils sont tous les deux la même chose, de nombreux éléments du framework exposent eux-mêmes une propriété de nom, mais pour ceux qui ne le font pas, vous pouvez utiliser x: name - je reste généralement avec x: name car il fonctionne pour tout.
Les contrôles peuvent s'exposer eux-mêmes comme propriété de dépendance s'ils le souhaitent (car ils doivent utiliser cette propriété de dépendance en interne), ou s'ils peuvent choisir de ne pas le faire.
Plus de détails dans msdn ici et ici :
la source
X: le nom peut provoquer des problèmes de mémoire si vous disposez de contrôles personnalisés. Il conservera un emplacement mémoire pour l'entrée NameScope.
Je dis de ne jamais utiliser x: Name sauf si vous le devez.
la source
FrameworkElement.RegisterName("elementname")
. Cependant, si vous appelez,FrameworkElement.UnregisterName("elementname")
cela peut être "déréférencé".La seule différence est que si vous utilisez des contrôles utilisateur dans un contrôle du même assemblage, le nom n'identifiera pas votre contrôle et vous obtiendrez une erreur «Utiliser x: nom pour les contrôles du même assemblage». Donc x: Name est la version WPF des contrôles de dénomination dans WPF. Le nom est simplement utilisé comme Winform Legacy. Ils voulaient différencier la dénomination des contrôles dans WPF et winforms car ils utilisent des attributs dans Xaml pour identifier les contrôles des autres assemblys qu'ils utilisaient x: pour les noms de contrôle.
Gardez juste à l'esprit que ne mettez pas de nom pour un contrôle juste pour le garder car il réside dans la mémoire comme un blanc et il vous avertira que Name a été appliqué pour un contrôle mais il n'est jamais utilisé.
la source
Nom :
x: Nom :
L'utilisation des deux directives dans XAML pour un FrameworkElement ou FrameworkContentElement provoquera une exception: si le XAML est compilé avec le balisage, l'exception se produira lors de la compilation du balisage, sinon elle se produira lors du chargement.
la source
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é name de cet objet.la source
J'utilise toujours la variante x: Name. Je ne sais pas si cela affecte les performances, je trouve cela plus facile pour la raison suivante. Si vous avez vos propres contrôles utilisateur qui résident dans un autre assembly, la propriété "Name" ne suffira pas toujours. Cela permet de coller plus facilement la propriété x: Name.
la source
Ce n'est pas un élément WPF mais un élément XML standard et BtBh y a répondu correctement, x fait référence à l'espace de noms par défaut. En XML, lorsque vous ne préfixez pas un élément / attribut avec un espace de noms, cela suppose que vous voulez l'espace de noms par défaut. Donc, taper
Name
n'est rien de plus qu'une courte main pourx:Name
. Plus de détails sur les espaces de noms XML peuvent être trouvés dans le texte du lienla source
L'une des réponses est que x: name doit être utilisé dans différents langages de programme tels que c # et name doit être utilisé pour le framework. Honnêtement, c'est ce que cela me semble.
la source
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. Dans Silverlight, à l'aide de l'API managée, le processus de création de ce champ est effectué par les étapes cibles MSBuild, qui sont également chargées de joindre les classes partielles d'un fichier XAML et son code-behind. Ce comportement n'est pas nécessairement spécifié en langage XAML; c'est l'implémentation particulière que Silverlight applique pour utiliser x: Name dans ses modèles de programmation et d'application.
En savoir plus sur MSDN ...
la source
Lorsque vous déclarez un élément Button en XAML, vous faites référence à une classe définie dans le temps d'exécution de Windows appelée Button.
Le bouton a de nombreux attributs tels que l'arrière-plan, le texte, la marge, ..... et un attribut appelé Nom.
Maintenant, lorsque vous déclarez un bouton en XAML, c'est comme créer un objet anonyme qui se trouvait avoir un attribut appelé Nom.
En général, vous ne pouvez pas faire référence à un objet anonyme, mais dans le cadre WPF, le processeur XAML vous permet de faire référence à cet objet par la valeur que vous avez donnée à l'attribut Name.
Jusqu'ici 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, l'espace de noms XAML a un attribut pour un objet appelé Nom (et comme il se trouve dans l'espace de noms XAML, vous avez donc X :) que vous pouvez définir afin que vous puissiez identifier votre objet et y faire référence.
Conclusion:
Le nom est un attribut d'un objet spécifique, mais X: le nom est un attribut de cet objet (il existe une classe qui définit un objet général).
la source
Ma recherche est
x:Name
aussi globale variable. Cependant,Name
comme variable locale . Cela signifie-t-il que x: Name vous pouvez l'appeler n'importe où dans votre fichier XAML, mais le nom ne l'est pas.Exemple:
Vous ne pouvez pas la
Binding
propriétéContent
deButton
avec le nom est "btn" car il en dehorsStackPanel
la source