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

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

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


当前回答

它们不是一回事。

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

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

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

其他回答

唯一的区别是,如果你在同一个程序集中使用用户控件到一个控件中,那么Name将不能识别你的控件,你将得到一个错误“在同一个程序集中使用x:Name控件”。 所以x:Name是WPF中命名控件的WPF版本。Name只是用作Winform Legacy。他们想在WPF和winforms中区分控件的命名,因为他们使用Xaml中的属性来标识控件与其他程序集,他们使用x:表示控件的名称。

请记住,不要为控件命名,因为它在内存中是空白的,它会给你一个警告,说明名称已应用于控件,但它从未使用过。

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

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

在XAML中实际上只有一个名称,即x: name。一个框架,比如WPF,可以通过在类上使用RuntimeNamePropertyAttribute将它的一个属性映射到XAML的x:Name属性,这个类指定一个类属性映射到XAML的x:Name属性。

这样做的原因是允许在运行时已经有“Name”概念的框架,例如WPF。例如,在WPF中,FrameworkElement引入了一个Name属性。

一般来说,类不需要存储x: name的名称以使其可用。所有x:Name的意思是XAML是生成一个字段来存储类后面的代码中的值。运行时对映射的处理依赖于框架。

那么,为什么有两种方法来做同样的事情呢?简单的答案是,因为两个概念映射到一个属性上。WPF希望在运行时保留元素的名称(可以通过Bind等方式使用),XAML需要知道您希望类后面代码中的字段可以访问哪些元素。WPF通过将Name属性标记为x:Name的别名将这两者联系在一起。

在未来,XAML会有更多x:Name的用途,比如允许你通过名称引用其他对象来设置属性,但在3.5和更早的版本中,它只用于创建字段。

你应该使用其中一种还是另一种实际上是一个风格问题,而不是技术问题。我将把这个留给其他人来推荐。

请参见AutomationProperties。Name VS x:Name, AutomationProperties。可访问性工具和一些测试工具使用Name。

名称:

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

x:名称:

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

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

我总是使用x:Name变量。 我不知道这是否会影响性能,我只是觉得它更容易,原因如下。 如果您有自己的用户控件驻留在另一个程序集中,只有“Name”属性并不总是足够的。这使得使用x:Name属性更加容易。