it-swarm.com.de

Was sind die Unterschiede zwischen den Attributen x: Name und Name in WPF?

Der Titel sagt alles. Manchmal scheint es, dass die Attribute Name und x:Name austauschbar sind.

Was sind also die definitiven Unterschiede zwischen ihnen und wann ist es vorzuziehen, eines über das andere zu verwenden?

Gibt es irgendwelche Auswirkungen auf die Leistung oder den Speicher, wenn sie falsch verwendet werden?

518
Drew Noakes

Es gibt wirklich nur einen Namen in XAML, den x:Name. Ein Framework, wie beispielsweise WPF, kann optional eine seiner Eigenschaften XAMLs x:Name zuordnen, indem Sie RuntimeNamePropertyAttribute für die Klasse verwenden, die eine der Klasseneigenschaften als Zuordnung zu dem Attribut x: Name von XAML bestimmt.

Der Grund dafür war, Frameworks zu berücksichtigen, die bereits zur Laufzeit ein Konzept von "Name" haben, wie beispielsweise WPF. In WPF führt FrameworkElement beispielsweise eine Name-Eigenschaft ein.

Im Allgemeinen muss eine Klasse den Namen nicht speichern, damit x:Name verwendet werden kann. Alle x:Name bedeutet, dass XAML ein Feld generiert, um den Wert im Code hinter der Klasse zu speichern. Was die Laufzeit mit diesem Mapping macht, hängt vom Framework ab.

Warum gibt es zwei Möglichkeiten, dasselbe zu tun? Die einfache Antwort ist, dass zwei Eigenschaften auf einer Eigenschaft abgebildet sind. WPF möchte, dass der Name eines Elements zur Laufzeit beibehalten wird (was unter anderem durch Bind verwendet werden kann), und XAML muss wissen, auf welche Elemente über Felder im Code hinter der Klasse zugegriffen werden soll. WPF verknüpft diese beiden durch Markieren der Name-Eigenschaft als Alias ​​von x: Name.

In Zukunft wird XAML mehr für x: Name verwendet werden, z. B. können Sie Eigenschaften festlegen, indem Sie anhand des Namens auf andere Objekte verweisen. In 3.5 und früheren Versionen werden sie 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 Testwerkzeugen verwendet.

442
chuckj

Sie sind nicht dasselbe.

x:Name ist ein xaml-Konzept, das hauptsächlich zur Referenzierung von Elementen verwendet wird. Wenn Sie einem Element das x: Name xaml-Attribut geben, wird "der angegebene x:Name der Name eines Felds, das im zugrunde liegenden Code erstellt wird, wenn xaml verarbeitet wird und das Feld einen Verweis auf das Objekt enthält." ( MSDN ) Es handelt sich also um ein vom Designer generiertes Feld, das standardmäßig über internen Zugriff verfügt.

Name ist die vorhandene Zeichenfolgeeigenschaft einer FrameworkElement, die wie jede andere wpf -Elementeigenschaft in Form eines xaml-Attributs aufgeführt ist.

Dies bedeutet, dass x:Name auch für eine größere Anzahl von Objekten verwendet werden kann. Dies ist eine Technik, mit der auf irgendetwas in xaml von einem bestimmten Namen verwiesen werden kann.

75
Kenan E. K.

x: Name und Name verweisen auf unterschiedliche Namespaces. 

x: name ist eine Referenz auf den standardmäßig definierten x-Namespace oben in der Xaml-Datei.

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

Sagen wir einfach, Name verwendet den Standard unterhalb des Namespaces. 

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

x: Name besagt, dass der Namespace mit dem Alias ​​x verwendet wird. x ist die Standardeinstellung, und die meisten Leute verlassen es, aber Sie können es beliebig ändern

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

ihre Referenz wäre also foo: name

Definieren und Verwenden von Namespaces in WPF


OK, lassen Sie uns das anders betrachten. Nehmen Sie an, Sie ziehen eine Schaltfläche auf Ihre Xaml-Seite. Sie können auf diese zwei Arten verweisen x: name und name. Alle xmlns = "http://schemas.Microsoft.com/winfx/2006/xaml/presentation"undxmlns: x = "http: // schemas. Microsoft.com/winfx/2006/xaml " sind Verweise auf mehrere Namespaces. Da xaml den Namespace Control (nicht 100%) und presentation das FrameworkElement enthält UND die Button-Klasse ein Vererbungsmuster von hat: 

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

Wenn man also erwarten würde, dass alles, was von FrameworkElement geerbt wird, Zugriff auf alle öffentlichen Attribute hat. Im Fall von Button erhält es also sein Name-Attribut von FrameworkElement ganz oben in der Hierarchiestruktur. Sie können also x: Name oder Name sagen, und beide werden vom FrameworkElement aus auf den Getter/Setter zugreifen. 

MSDN-Referenz

WPF definiert ein CLR-Attribut, das von XAML-Prozessoren verwendet wird, um mehrere CLR-Namespaces einem einzigen XML-Namespace zuzuordnen. Das Attribut XmlnsDefinitionAttribute wird auf der Assembly-Ebene im Quellcode platziert, der die Assembly erzeugt. Der Quellcode der WPF-Assembly verwendet dieses Attribut, um die verschiedenen allgemeinen Namespaces, z. B. System.Windows und System.Windows.Controls, der http://schemas.Microsoft.com/winfx/2006/xaml/presentation zuzuordnen. Namespace.

Die Assembly-Attribute werden also ungefähr so ​​aussehen:

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")]  
32
cgreeno

Sie sind beide dasselbe, viele Framework-Elemente setzen selbst eine Namenseigenschaft frei, aber für diejenigen, die nicht x: name verwenden können - ich halte mich normalerweise bei x: name, weil es für alles funktioniert.

Steuerelemente können den Namen selbst als Abhängigkeitseigenschaft bereitstellen, wenn sie möchten (weil sie diese Abhängigkeitseigenschaft intern verwenden müssen), oder sie können sich dazu entscheiden. 

Weitere Details in msdn hier und hier :

Einige Anwendungen auf WPF-Framework-Ebene kann die Verwendung von .__ vermeiden. x: Namensattribut, weil der Name Abhängigkeitseigenschaft wie angegeben innerhalb des WPF-Namespaces für mehrere der wichtigen Basisklassen wie FrameworkElement/FrameworkContentElement erfüllt denselben Zweck. Es gibt noch einige gebräuchliche XAML und Framework Szenarien, in denen Code auf ein .__ zugreift. Element ohne Name-Eigenschaft ist notwendig, vor allem in bestimmten Unterstützung für Animationen und Storyboards Klassen. Zum Beispiel sollten Sie Geben Sie x: Name in Zeitleisten und .__ an. In XAML erstellte Transformationen, wenn Sie beabsichtigen, sie vom Code aus zu referenzieren.

Wenn Name als Eigenschaft auf .__ verfügbar ist. Die Klasse, Name und x: Name können verwendet werden austauschbar als Attribute, aber eine Fehler wird angezeigt, wenn beide .__ sind. für dasselbe Element angegeben.

19
Steven Robbins

X: Name kann zu Speicherproblemen führen, wenn Sie über benutzerdefinierte Steuerelemente verfügen. Es wird ein Speicherplatz für den NameScope-Eintrag erhalten. 

Ich sage niemals x: Name, es sei denn Sie müssen.

9
scott

Der einzige Unterschied besteht darin, dass, wenn Sie Benutzersteuerelemente für ein Steuerelement aus derselben Assembly verwenden, der Name Ihr Steuerelement nicht identifiziert und Sie die Fehlermeldung "x: Name für Steuerelemente in derselben Assembly verwenden" erhalten. X: Name ist also die WPF-Versionierung der Benennungssteuerelemente in WPF. 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 von anderen Assemblys zu identifizieren, für die sie x: for Names of control verwendet haben. 

Denken Sie nur daran, dass Sie keinen Namen für ein Steuerelement verwenden, nur um es zu speichern, da es im Speicher als Leerzeichen gespeichert wird. Sie werden darauf hingewiesen, dass Name für ein Steuerelement angewendet wurde, es wird jedoch nie verwendet. 

7
Bipul Kumar

Name :

  1. kann nur für Nachkommen von FrameworkElement und FrameworkContentElement verwendet werden;
  2. kann über SetValue () und property-like von code-behind eingestellt werden.

x: Name :

  1. kann für fast alle XAML-Elemente verwendet werden;
  2. kann NICHT von Code-Behind über SetValue () gesetzt werden; Sie kann nur mit der Attribut -Syntax für Objekte festgelegt werden, da es sich um eine Direktive handelt.

Die Verwendung beider Direktiven in XAML für ein FrameworkElement oder FrameworkContentElement verursacht eine Ausnahme: Wenn die XAML-Markup-Kompilierung erstellt wird, tritt die Ausnahme in der Markup-Kompilierung auf, andernfalls beim Laden.

x:Name bedeutet: Erstellen Sie ein Feld im Code dahinter, um eine Referenz auf dieses Objekt zu speichern.

Name bedeutet: Setze die Namenseigenschaft dieses Objekts.

5

Ich verwende immer die x: Name-Variante . Ich habe keine Ahnung, ob dies Auswirkungen auf die Leistung hat, ich finde es aus folgendem Grund einfacher "Eigentum reicht nicht immer aus. Dies macht es einfacher, auch die x: Name -Eigenschaft festzuhalten.

4
Simon

Es ist kein WPF-Element, sondern ein Standard-XML-Element, und BtBh hat es richtig beantwortet, x bezieht sich auf den Standardnamensraum. Wenn Sie einem Element/Attribut keinen Namespace voranstellen, wird in XML davon ausgegangen, dass Sie den Standard-Namespace verwenden möchten. __ Die Eingabe von Name ist also nichts weiter als eine kurze Hand für x:Name. Weitere Informationen zu XML-Namespaces finden Sie unter Linktext

3
Robert MacLean

Eine der Antworten ist, dass x: name in verschiedenen Programmiersprachen wie c # und name für das Framework verwendet werden soll. Ehrlich gesagt klingt es für mich so.

2
daddycardona

Wenn Sie ein Button-Element in XAML deklarieren, beziehen Sie sich auf eine in Windows-Laufzeit definierte Klasse namens Button.

Die Schaltfläche hat viele Attribute wie Hintergrund, Text, Rand usw. und ein Attribut namens Name.

Wenn Sie jetzt einen Button in XAML deklarieren, ist dies wie das Erstellen eines anonymen Objekts, das zufällig ein Attribut namens Name hatte.

Im Allgemeinen können Sie nicht auf ein anonymes Objekt verweisen, aber im WPF-Framework können Sie mit XAML-Prozessor auf das Objekt anhand des Werts verweisen, den Sie dem Attribut Name zugewiesen haben.

So weit, ist es gut.

Eine andere Methode zum Erstellen eines Objekts ist das Erstellen eines benannten Objekts anstelle eines anonymen Objekts. In diesem Fall hat der XAML-Namespace ein Attribut für ein Objekt namens Name (und da es sich im XAML-Namensraum befindet, muss X :) festgelegt werden, 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).

2
RockyMan Rocky

Das angegebene x: Name wird zum Namen eines Felds, das im zugrunde liegenden Code erstellt wird, wenn XAML verarbeitet wird. Dieses Feld enthält eine Referenz auf das Objekt. In Silverlight wird mithilfe der verwalteten API der Prozess zum Erstellen dieses Feldes von den MSBuild-Zielschritten ausgeführt, die auch für den Beitritt zu den Teilklassen einer XAML-Datei und deren Code-Behind verantwortlich sind. Dieses Verhalten ist nicht notwendigerweise in XAML-Sprache angegeben. Dies ist die spezielle Implementierung, die Silverlight verwendet, um x: Name in seinen Programmier- und Anwendungsmodellen zu verwenden.

Weitere Informationen zu MSDN ...

1
Edd

Meine Forschung ist x:Name as global Variable. Name as lokal Variable. Bedeutet das x: Name, den Sie an einer beliebigen Stelle in Ihrer XAML-Datei aufrufen können, Name jedoch nicht.
Beispiel:

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

Sie können die Binding-Eigenschaft Content von Button nicht verwenden, wobei Name "btn" ist, da sie außerhalb von StackPanel liegt. 

0
Phuc Hoang