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


Le titre dit tout. Parfois, il semble que le Name et x:Name les attributs sont 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 de performance ou de mémoire à les utiliser dans le mauvais sens?


492
2018-02-26 09:53


origine


Réponses:


Il n'y a vraiment qu'un seul nom dans XAML, le x:Name. Un framework, tel que WPF, peut éventuellement mapper une de ses propriétés sur XAML x:Name en utilisant le RuntimeNamePropertyAttribute sur la classe qui désigne l'une des propriétés des classes en tant que mappage vers 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 "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 pour x:Name être utilisable. Tout x:Name signifie à XAML générer 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 est parce qu'il y a 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 (ce qui est utilisable via Bind, entre autres choses) et XAML doit connaître les éléments que vous souhaitez rendre accessibles aux champs du code derrière la classe. WPF lie ces deux ensemble en marquant la propriété Name comme un alias de x: Name.

À l'avenir, XAML aura plus d'utilisations pour x: Name, par exemple en vous permettant de définir des propriétés en vous référant à d'autres objets par leur nom, mais dans 3.5 et versions antérieures, 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 également AutomationProperties.Name VS x: Nom, AutomationProperties.Name est utilisé par les outils d'accessibilité et certains outils de test.


429
2018-02-27 00:52



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 paramètre spécifié x:Name devient le nom d'un champ créé dans le code sous-jacent lorsque xaml est traité et ce champ contient une référence à l'objet. "(MSDNIl s'agit donc d'un champ généré par un concepteur, qui a un accès interne par défaut.

Name est la propriété de chaîne existante d'un FrameworkElement, répertorié comme toute autre propriété d'élément wpf sous la forme d'un attribut xaml.

En conséquence, cela signifie également x:Name peut être utilisé sur une plus large gamme d'objets. C'est une technique pour permettre à n'importe quoi dans xaml d'être référencé par un nom donné.


71
2017-07-14 23:34



x: Nom et Nom référencent 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.

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

Juste dire prénom utilise la valeur par défaut sous l'espace de noms.

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

x: nom dit 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 pour ce que vous voulez

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

alors votre référence serait foo: nom

Définir et utiliser les espaces de noms dans WPF


OK laisse regarder cela différemment. Disons que vous faites glisser un bouton sur votre page Xaml. Vous pouvez référencer ces 2 manières x: nom et prénom. Tout 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 noms (pas à 100%) et présentation détient le FrameworkElement Et le Classe de bouton a un modèle d'héritage de:

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

Donc, comme on peut s’attendre à ce que tout ce qui hérite de FrameworkElement ait accès à tous ses attributs publics. Ainsi, dans le cas de Button, il obtient son attribut Name à partir de FrameworkElement, tout en haut de l'arborescence de la hiérarchie. Alors tu peux dire x: nom ou prénom et ils vont tous les deux accéder au getter / setter à partir de 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 à un seul espace de noms XML. le XmlnsDefinitionAttribute L'attribut 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 différents espaces de noms communs, tels que System.Windows et System.Windows.Controls, vers le http://schemas.microsoft.com/winfx/2006/xaml/presentation espace de nommage.

Ainsi, les attributs d'assemblage ressembleront à ceci:

PresentationFramework.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")]  

29
2018-02-26 10:36



Ils sont tous les deux la même chose, de nombreux éléments de framework exposent eux-mêmes une propriété name, mais pour ceux qui ne le font pas, vous pouvez utiliser x: name.

Les contrôles peuvent exposer leur nom en tant que propriété de dépendance s'ils le souhaitent (car ils doivent utiliser cette propriété de dépendance en interne) ou choisir de ne pas le faire.

Plus de détails dans msdn ici et ici:

Certaines applications au niveau du framework WPF   pourrait être en mesure d'éviter toute utilisation de la   x: attribut name, car le nom   propriété de dépendance telle que spécifiée   dans l'espace de noms WPF pour plusieurs   des classes de base importantes telles que   FrameworkElement / FrameworkContentElement   satisfait à ce même objectif. Il y a   encore du XAML commun et du cadre   scénarios où l'accès au code à un   élément sans la propriété Nom est   nécessaire, notamment dans certaines   animation et support de storyboard   Des classes. Par exemple, vous devriez   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 Nom est disponible en tant que propriété sur   la classe, Name et x: Name peuvent être utilisés   indifféremment comme attributs, mais un   erreur se produira si les deux sont   spécifié sur le même élément.


19
2018-02-26 10:03



X: Name peut provoquer des problèmes de mémoire si vous disposez de contrôles personnalisés. Il conservera un emplacement de mémoire pour l'entrée NameScope.

Je dis jamais utiliser x: Nom sauf si vous devez.


9
2018-01-13 18:57



La seule différence est que si vous utilisez les contrôles utilisateur dans un contrôle de Same Assembly, alors Name n'identifiera pas votre contrôle et vous obtiendrez une erreur "Utilisez x: Name pour les contrôles dans le même assembly". So x: Name est le versionnement WPF des contrôles de nommage dans WPF. Le nom est simplement utilisé comme héritage Winform. Ils souhaitaient 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: for Names of control.

Gardez juste à l'esprit de ne pas mettre un nom pour un contrôle juste pour le garder car il reste en mémoire comme un blanc et il vous avertira que le nom a été appliqué pour un contrôle mais qu'il n'a jamais été utilisé.


7
2018-01-17 18:03



prénom:

  1. peut être utilisé uniquement pour les descendants de FrameworkElement et FrameworkContentElement;
  2. peut être défini à partir de code-behind via SetValue () et propriété-like.

x: nom:

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

L'utilisation des deux directives dans XAML pour un FrameworkElement ou FrameworkContentElement provoquera une exception: si le balisage XAML est compilé, l'exception se produira sur la compilation de balisage, sinon elle se produit sur le chargement.


7
2017-08-27 17:12