在WPF中,x:Name和Name属性有什么区别?

标题说明了一切。 有时似乎Namex:Name属性是可以互换的。

那么,它们之间的明确区别是什么,什么时候最好使用一个呢?

是否有任何性能或内存暗示以错误的方式使用它们?


XAML中只有一个名称,即x:Name 。 一个框架,如WPF,可任选地映射其属性以XAML的之一x:Name通过使用RuntimeNamePropertyAttribute上,其指定的类属性映射到x的一个类:XAML的名称属性。

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

通常,一个类不需要存储x:Name以便可用。 所有x:Name意味着XAML生成一个字段以将值存储在类后面的代码中。 运行时对该映射的作用是依赖于框架的。

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

将来,XAML将有更多用途用于x:Name,例如允许您通过引用其他对象的名称来设置属性,但在3.5和之前版本中,它仅用于创建字段。

无论你应该使用其中一种还是另一种,都是一种真正的风格问题,而不是技术问题。 我会将其留给其他人作为推荐。

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


它们不是同一件事。

x:Name是一个xaml概念,主要用于引用元素。 当您给元素x:Name xaml属性时,“指定的x:Name将成为处理xaml时在基础代码中创建的字段的名称,并且该字段包含对该对象的引用。” (MSDN)所以,这是一个由设计师生成的字段,默认情况下具有内部访问权限。

NameFrameworkElement的现有字符串属性,以xaml属性的形式列出为任何其他wpf元素属性。

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


x:名称和名称引用不同的名称空间。

x:name是对Xaml文件顶部默认定义的x名称空间的引用。

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

只是说名称使用默认的以下命名空间。

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

x:名称是使用具有x别名的名称空间。 x是默认设置,大多数人离开它,但您可以将其更改为任何您喜欢的

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

所以你的参考将是foo:name

在WPF中定义和使用名称空间


OK让我们看看这个不同的方式。 假设您将一个按钮拖放到您的Xaml页面上。 您可以参考这2种方法x:名称名称 。 所有xmlns =“http://schemas.microsoft.com/winfx/2006/xaml/presentation” xmlns:x =“http://schemas.microsoft.com/winfx/2006/xaml”都是对多个命名空间的引用。 由于xaml拥有Control命名空间(不是100%),并且表示保存了FrameworkElement ,而Button类具有以下继承模式:

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

因此,人们期望从FrameworkElement继承的任何内容都可以访问其所有公共属性。 所以在Button的情况下,它从层次结构树顶部的FrameworkElement中获取它的Name属性。 所以你可以说x:NameName ,它们都将从FrameworkElement访问getter / setter。

MSDN参考

为了将多个CLR名称空间映射到单个XML名称空间,WPF定义了XAML处理器使用的CLR属性。 XmlnsDefinitionAttribute属性位于生成程序集的源代码中的程序集级别。 WPF程序集源代码使用此属性将各种通用名称空间(如System.Windows和System.Windows.Controls)映射到http://schemas.microsoft.com/winfx/2006/xaml/presentation命名空间。

所以程序集的属性如下所示:

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")]  
链接地址: http://www.djcxy.com/p/3613.html

上一篇: In WPF, what are the differences between the x:Name and Name attributes?

下一篇: Can I change a private readonly inherited field in C# using reflection?