有时,Name和x:Name属性似乎是可互换的。

那么,它们之间的决定性区别是什么?什么时候使用一种比另一种更可取?

以错误的方式使用它们会对性能或内存产生影响吗?


当前回答

名称:

只能用于FrameworkElement和FrameworkContentElement的后代; 可以通过SetValue()和property-like在代码后面设置。

x:名称:

可以用于几乎所有XAML元素; 不能设置从 通过SetValue()隐藏代码;只能使用属性设置 对象的语法,因为它是一个指令。

在XAML中对一个FrameworkElement或FrameworkContentElement使用这两个指令将导致异常:如果XAML是标记编译,则异常将在标记编译时发生,否则将在加载时发生。

其他回答

当您在XAML中声明Button元素时,您引用的是在windows运行时中定义的一个名为Button的类。

按钮有很多属性,如背景,文本,边距,.....和一个名为Name的属性。

现在,当您在XAML中声明一个Button时,就像创建一个匿名对象,该对象碰巧有一个名为Name的属性。

一般来说,你不能引用一个匿名对象,但是在WPF框架中,XAML处理器允许你通过给Name属性的任何值来引用该对象。

到目前为止一切顺利。

创建对象的另一种方法是创建命名对象而不是匿名对象。在这种情况下,XAML名称空间有一个名为Name的对象属性(由于它在XAML名称空间中,因此有X:),您可以设置该属性,以便识别对象并引用它。

结论:

Name是特定对象的属性,但X:Name是该对象的一个属性(有一个类定义了一个通用对象)。

The specified x:Name becomes the name of a field that is created in the underlying code when XAML is processed, and that field holds a reference to the object. In Silverlight, using the managed API, the process of creating this field is performed by the MSBuild target steps, which also are responsible for joining the partial classes for a XAML file and its code-behind. This behavior is not necessarily XAML-language specified; it is the particular implementation that Silverlight applies to use x:Name in its programming and application models.

阅读更多关于MSDN…

它们不是一回事。

x:Name是一个xaml概念,主要用于引用元素。当您为元素赋予x:Name xaml属性时,“指定的x:Name将成为处理xaml时在底层代码中创建的字段的名称,并且该字段包含对该对象的引用。”因此,它是一个由设计器生成的字段,默认情况下具有内部访问权限。

Name是FrameworkElement的现有字符串属性,以xaml属性的形式列出,与任何其他wpf元素属性一样。

因此,这也意味着x:Name可以用于更广泛的对象。这是一种使xaml中的任何东西都可以通过给定名称引用的技术。

它们都是一样的东西,很多框架元素本身公开了name属性,但对于那些不公开的元素,你可以使用x:name -我通常只使用x:name,因为它适用于任何东西。

控件可以将名称本身公开为依赖属性(因为它们需要在内部使用该依赖属性),也可以选择不这样做。

更多细节在msdn这里和这里:

Some WPF framework-level applications might be able to avoid any use of the x:Name attribute, because the Name dependency property as specified within the WPF namespace for several of the important base classes such as FrameworkElement/FrameworkContentElement satisfies this same purpose. There are still some common XAML and framework scenarios where code access to an element with no Name property is necessary, most notably in certain animation and storyboard support classes. For instance, you should specify x:Name on timelines and transforms created in XAML, if you intend to reference them from code. If Name is available as a property on the class, Name and x:Name can be used interchangeably as attributes, but an error will result if both are specified on the same element.

x:Name的意思是:在后面的代码中创建一个字段来保存对该对象的引用。

Name表示:设置该对象的Name属性。