2010-12-13 11 views
45

Quelle est la différence entre x:Key et x:Name dans WPF?Quelle est la différence entre x: Key et x: Name dans WPF?

Je ne suis pas sûr de ce qu'est la vraie différence.

+1

@Alastair, la question que vous avez énumérée comme une dupe possible n'est pas liée à cela. – Josh

+1

comment est-ce un doublon? L'autre question parle de 'Name' vs' Type'. Cette question concerne 'Key' vs' Name'. – jalf

+0

Mon erreur, j'ai mal interprété la question "possible dupe". Excuses. –

Répondre

43

Bien qu'ils soient utilisés à des fins similaires, ils ne sont pas interchangeables. x: La clé est utilisée pour les éléments qui sont ajoutés en tant que valeurs à un dictionnaire, le plus souvent pour les styles et autres ressources qui sont ajoutés à un ResourceDictionary. Lors de la définition de l'attribut x: Key, il n'existe aucune propriété correspondante sur l'objet ou même une propriété de dépendance attachée en cours de définition. Il est simplement utilisé par le processeur XAML pour savoir quelle clé utiliser lors de l'appel de Dictionary.Add.

x: Le nom est un peu plus compliqué. Il est utilisé pour appliquer un nom associé à un objet (généralement un objet dérivé de FrameworkElement) dans la portée de certains éléments parents. Cette portée est appelée un "namescope" et la façon la plus simple d'y penser est d'imaginer un UserControl qui contient un <TextBox x:Name="foo" />.

Vous pouvez ensuite placer plusieurs instances de UserControl sur une fenêtre sans que le nom "foo" ne soit en conflit, car chaque UserControl possède sa propre portée de nom.

Il convient de noter que FrameworkElement définit une propriété de dépendance nommée Name qui équivaut à définir x: Name.

L'autre différence est que le concepteur XAML crée des membres dans le code-behind pour les éléments qui ont un x: Name. Ce n'est pas le cas des objets ajoutés à un dictionnaire en utilisant x: Key.

Vous trouverez plus d'informations à ce sujet dans la section des remarques de la documentation MSDN pour the x:Name directive.

20

x: La clé n'est valide que dans le cadre d'un élément ResourceDictionary. x: La clé est utilisée comme identifiant principal pour les éléments dans ResourceDictionary. En revanche, x: Name est valide dans la portée de tout, sauf ResourceDictionary. x: La clé n'est pas valide en dehors de la portée ResourceDictionary.