Der Titel sagt alles. Manchmal scheint es, dass die Name
und x:Name
Attribute austauschbar sind.
Also, was sind die endgültigen Unterschiede zwischen ihnen und wann ist es vorzuziehen, einen über den anderen zu verwenden?
Gibt es irgendwelche Auswirkungen auf die Leistung oder den Speicher, wenn sie falsch verwendet werden?
.net
wpf
xaml
name-attribute
Drew Noakes
quelle
quelle
x:Name
einwandfrei funktioniert. Ich musste es nur ändern,Name
sonst konnte ich das Steuerelement in meinem .xaml.cs-Code nicht referenzieren, daher gehe ich davon aus, dass es nicht mehr immer funktioniert.Antworten:
Es gibt wirklich nur einen Namen in XAML, den
x:Name
. Ein Framework wie WPF kann optional eine seiner Eigenschaften XAMLs zuordnen,x:Name
indem es dieRuntimeNamePropertyAttribute
on-Klasse verwendet, die eine der Klasseneigenschaften als Zuordnung zum x: Name-Attribut von XAML festlegt.Der Grund dafür war, Frameworks zuzulassen, die zur Laufzeit bereits das Konzept "Name" haben, wie z. B. WPF. In WPF wird beispielsweise
FrameworkElement
eine Name-Eigenschaft eingeführt.Im Allgemeinen muss eine Klasse den Namen nicht speichern, um verwendet werden
x:Name
zu können. Alles,x:Name
was XAML bedeutet, ist, ein Feld zu generieren, um den Wert im Code hinter der Klasse zu speichern. Was die Laufzeit mit dieser Zuordnung macht, ist vom Framework abhängig.Warum gibt es also zwei Möglichkeiten, dasselbe zu tun? Die einfache Antwort lautet, dass zwei Konzepte auf eine Eigenschaft abgebildet sind. WPF möchte, dass der Name eines Elements zur Laufzeit erhalten bleibt (was unter anderem über Bind verwendet werden kann), und XAML muss wissen, auf welche Elemente Felder im Code hinter der Klasse zugreifen sollen. WPF verbindet diese beiden Elemente, indem es die Name-Eigenschaft als Alias von x: Name markiert.
In Zukunft wird XAML mehr Verwendungszwecke für x: Name haben, z. B. das Festlegen von Eigenschaften durch Verweisen auf andere Objekte nach Namen. In Version 3.5 und früheren Versionen wird XAML jedoch nur zum Erstellen von Feldern verwendet.
Ob Sie das eine oder das andere verwenden sollten, ist wirklich eine Stilfrage, keine technische. Ich werde das anderen für eine Empfehlung überlassen.
Siehe auch AutomationProperties.Name VS x: Name , AutomationProperties.Name wird von Eingabehilfen und einigen Testtools verwendet.
quelle
x:Name
daName
kein Feld erstellt wird, das im CodeBehind erkannt wird. Ich weiß immer noch nicht, warum das passiert.Name
Eigenschaft hat, bedeutet dies dasselbe. Wenn das Element keineName
Eigenschaft hat, müssen Sie verwendenx:Name
.Sie sind nicht dasselbe.
x:Name
ist ein xaml-Konzept, das hauptsächlich zum Referenzieren von Elementen verwendet wird. Wenn Sie einem Element das xaml-Attribut x: Name geben, "wird das angegebenex:Name
zum Namen eines Felds, das im zugrunde liegenden Code erstellt wird, wenn xaml verarbeitet wird, und dieses Feld enthält einen Verweis auf das Objekt." ( MSDN ) Es handelt sich also um ein vom Designer generiertes Feld, das standardmäßig über internen Zugriff verfügt.Name
ist die vorhandene Zeichenfolgeeigenschaft von aFrameworkElement
, die als jede andere wpf-Elementeigenschaft in Form eines xaml-Attributs aufgeführt ist.Infolgedessen kann dies auch
x:Name
für eine größere Anzahl von Objekten verwendet werden. Dies ist eine Technik, mit der alles in xaml mit einem bestimmten Namen referenziert werden kann.quelle
x: Name und Name verweisen auf unterschiedliche Namespaces.
x: name ist ein Verweis auf den x-Namespace, der standardmäßig oben in der Xaml-Datei definiert ist.
Wenn Sie nur Name sagen, wird der unten stehende Standard-Namespace verwendet.
x: Name sagt, benutze den Namespace, der den x- Alias hat. x ist die Standardeinstellung und die meisten Leute verlassen sie, aber Sie können sie nach Belieben ändern
Ihre Referenz wäre also foo: name
Definieren und Verwenden von Namespaces in WPF
OK, sehen wir uns das anders an. Angenommen, Sie ziehen eine Schaltfläche per Drag & Drop auf Ihre Xaml-Seite. Sie können auf zwei Arten auf x verweisen : Name und Name . Alle xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" und xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" verweisen auf mehrere Namespaces . Da xaml den Control- Namespace enthält (nicht 100%) und die Präsentation das FrameworkElement AND enthält, hat die Button-Klasse ein Vererbungsmuster von:
Wie zu erwarten wäre, hätte alles, was von FrameworkElement erbt, Zugriff auf alle öffentlichen Attribute. Im Fall von Button wird das Attribut Name von FrameworkElement ganz oben im Hierarchiebaum abgerufen. So kann man sagen , x: Name oder Namen , und sie werden sowohl die Getter / Setter vom Framework zugreifen.
MSDN-Referenz
WPF definiert ein CLR-Attribut, das von XAML-Prozessoren verwendet wird, um mehrere CLR-Namespaces einem einzelnen XML-Namespace zuzuordnen. Das XmlnsDefinitionAttribute- Attribut wird auf Assemblyebene im Quellcode platziert, der die Assembly erstellt. Der Quellcode der WPF-Assembly verwendet dieses Attribut, um die verschiedenen allgemeinen Namespaces wie System.Windows und System.Windows.Controls dem Namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation zuzuordnen.
Die Assembly-Attribute sehen also ungefähr so aus:
PresentationFramework.dll - XmlnsDefinitionAttribute:
quelle
http://schemas.microsoft.com/winfx/2006/xaml
hält ,Control
da Sie es direkt in XAML ohne ein ‚x‘ Namespace verwenden:<Control />
Sie sind beide dasselbe, viele Framework-Elemente machen eine Namenseigenschaft selbst verfügbar, aber für diejenigen, die dies nicht tun, können Sie x: name verwenden - ich bleibe normalerweise nur bei x: name, weil es für alles funktioniert.
Steuerelemente können den Namen selbst als Abhängigkeitseigenschaft verfügbar machen, wenn sie dies möchten (da sie diese Abhängigkeitseigenschaft intern verwenden müssen), oder sie können sich dagegen entscheiden.
Weitere Details in msdn hier und hier :
quelle
X: Der Name kann Speicherprobleme verursachen, wenn Sie über benutzerdefinierte Steuerelemente verfügen. Es wird ein Speicherort für den NameScope-Eintrag gespeichert.
Ich sage, benutze niemals x: Name, es sei denn du musst.
quelle
FrameworkElement.RegisterName("elementname")
. Wenn Sie es aufrufenFrameworkElement.UnregisterName("elementname")
, kann es jedoch "dereferenziert" werden.Der einzige Unterschied besteht darin, dass, wenn Sie Benutzersteuerelemente in einem Steuerelement aus derselben Assembly verwenden, Name Ihr Steuerelement nicht identifiziert und die Fehlermeldung "Verwenden Sie x: Name für Steuerelemente in derselben Assembly" angezeigt wird. X: Name ist also die WPF-Versionierung von Namenssteuerelementen in WPF. Der Name wird nur als Winform Legacy verwendet. Sie wollten die Benennung von Steuerelementen in WPF und Winforms unterscheiden, da sie Attribute in Xaml verwenden, um Steuerelemente aus anderen Assemblys zu identifizieren, die sie x: für Namen von Steuerelementen verwendeten.
Denken Sie daran, dass Sie einem Steuerelement keinen Namen geben, nur um es zu behalten, da es sich im Speicher als Leerzeichen befindet. Sie erhalten eine Warnung, dass der Name für ein Steuerelement angewendet wurde, aber nie verwendet wird.
quelle
Name :
x: Name :
Die Verwendung beider Anweisungen in XAML für ein FrameworkElement oder FrameworkContentElement führt zu einer Ausnahme: Wenn die XAML markupkompiliert ist, tritt die Ausnahme bei der Markupkompilierung auf, andernfalls tritt sie beim Laden auf.
quelle
x:Name
bedeutet: Erstellen Sie ein Feld im Code dahinter, um einen Verweis auf dieses Objekt zu enthalten.Name
bedeutet: Legen Sie die Eigenschaft name dieses Objekts fest.quelle
Ich benutze immer die Variante x: Name. Ich habe keine Ahnung, ob sich dies auf die Leistung auswirkt. Ich finde es aus folgendem Grund einfacher. Wenn Sie über eigene Benutzersteuerelemente verfügen, die sich in einer anderen Assembly befinden, reicht die Eigenschaft "Name" nicht immer aus. Dies macht es einfacher, auch die Eigenschaft x: Name beizubehalten.
quelle
Es ist kein WPF-Element, sondern ein Standard-XML-Element, und BtBh hat es richtig beantwortet. X bezieht sich auf den Standard-Namespace. Wenn Sie in XML einem Element / Attribut keinen Namespace voranstellen, wird davon ausgegangen, dass Sie den Standard-Namespace möchten. Tippen
Name
ist also nichts weiter als eine kurze Hand fürx:Name
. Weitere Details zu XML-Namespaces finden Sie unter Linktextquelle
Eine der Antworten ist, dass x: name in verschiedenen Programmiersprachen wie c # verwendet werden soll und name für das Framework verwendet werden soll. Ehrlich gesagt klingt das für mich so.
quelle
Der angegebene x: Name wird zum Namen eines Felds, das im zugrunde liegenden Code erstellt wird, wenn XAML verarbeitet wird, und dieses Feld enthält einen Verweis auf das Objekt. In Silverlight wird das Erstellen dieses Felds mithilfe der verwalteten API von den MSBuild-Zielschritten ausgeführt, die auch für das Zusammenführen der Teilklassen für eine XAML-Datei und deren CodeBehind verantwortlich sind. Dieses Verhalten ist nicht unbedingt in der XAML-Sprache angegeben. Es ist die spezielle Implementierung, die Silverlight für die Verwendung von x: Name in seinen Programmier- und Anwendungsmodellen anwendet .
Lesen Sie mehr über MSDN ...
quelle
Wenn Sie ein Button-Element in XAML deklarieren, beziehen Sie sich auf eine in der Windows-Laufzeit definierte Klasse namens Button.
Die Schaltfläche hat viele Attribute wie Hintergrund, Text, Rand, ..... und ein Attribut namens Name.
Wenn Sie jetzt eine Schaltfläche in XAML deklarieren, erstellen Sie ein anonymes Objekt, das zufällig ein Attribut namens Name hat.
Im Allgemeinen können Sie nicht auf ein anonymes Objekt verweisen, aber im WPF-Framework können Sie mit dem XAML-Prozessor auf dieses Objekt mit dem Wert verweisen, den Sie dem Attribut Name gegeben haben.
So weit, ist es gut.
Eine andere Möglichkeit, ein Objekt zu erstellen, besteht darin, ein benanntes Objekt anstelle eines anonymen Objekts zu erstellen. In diesem Fall hat der XAML-Namespace ein Attribut für ein Objekt namens Name (und da es sich im XAML-Namensraum befindet, haben Sie X :), das Sie festlegen können, damit Sie Ihr Objekt identifizieren und darauf verweisen können.
Fazit:
Name ist ein Attribut eines bestimmten Objekts, aber X: Name ist ein Attribut dieses Objekts (es gibt eine Klasse, die ein allgemeines Objekt definiert).
quelle
Meine Forschung ist
x:Name
als globale Variable. DochName
als lokaler Variable. Bedeutet das x: Name, den Sie überall in Ihrer XAML-Datei aufrufen können, Name jedoch nicht.Beispiel:
Sie können nicht
Binding
EigentumContent
vonButton
mit Namen „BTN“ , weil es außerhalbStackPanel
quelle