标题说明了一切。 有时似乎Name
和x:Name
属性是可互换的。
那么,它们之间的明确区别是什么?何时使用一种优于另一种呢?
以错误的方式使用它们是否会对性能或内存产生影响?
它们不是同一件事。
x:Name
是一个xaml概念,主要用于引用元素。 当给元素提供x:Name xaml属性时,“指定的x:Name
成为在处理xaml时在基础代码中创建的字段的名称,并且该字段包含对该对象的引用。” ( MSDN )因此,这是一个设计师生成的字段,默认情况下具有内部访问权限。
Name
是FrameworkElement
的现有字符串属性,以xaml属性的形式与任何其他wpf元素属性一起列出。
结果,这也意味着x:Name
可以在更大范围的对象上使用。 这是一种使xaml中的任何内容都能被给定名称引用的技术。
唯一的区别是,如果将用户控件用于Same Assembly中的控件,则Name将无法标识您的控件,并且会出现错误“在同一Assembly中为控件使用x:Name”。 因此x:Name是WPF中命名控件的WPF版本。 名称仅用作Winform Legacy。 他们希望区分WPF和Winforms中控件的命名,因为他们使用Xaml中的属性来从其他使用x:表示控件名称的程序集中识别控件。
请记住,不要仅仅为了保留控件的名称而将其命名,因为它作为空白驻留在内存中,它会警告您名称已用于控件,但从未使用过。
名称 :
x:名称 :
在XAML中为一个FrameworkElement或FrameworkContentElement使用两个指令将导致异常:如果XAML是标记编译的,则该异常将在标记编译时发生,否则将在加载时发生。
答案之一是x:name将在不同的程序语言(例如c#)中使用,而name将用于框架。 老实说,这就是我的感觉。
x:Name
意思是:在后面的代码中创建一个字段来保存对该对象的引用。
Name
表示:设置此对象的名称属性。
指定的x:Name成为处理XAML时在基础代码中创建的字段的名称,并且该字段包含对该对象的引用。 在Silverlight中,使用托管API,创建此字段的过程由MSBuild目标步骤执行,这些步骤还负责将XAML文件及其代码隐藏的部分类联接在一起。 此行为不一定是指定的XAML语言。 Silverlight适用于在其编程和应用程序模型中使用x:Name的特定实现。
阅读有关MSDN的更多信息...
当您在XAML中声明Button元素时,您所引用的是Windows运行时中定义的类Button。
按钮具有许多属性,例如背景,文本,边距,.....和一个名为名称的属性。
现在,当您在XAML中声明一个Button时,就像创建一个匿名对象,碰巧它具有一个名为Name的属性。
通常,您不能引用匿名对象,但是在WPF框架中,XAML处理器使您可以通过对Name属性指定的任何值来引用该对象。
到现在为止还挺好。
创建对象的另一种方法是创建一个命名对象而不是匿名对象。 在这种情况下,您可以设置XAML命名空间(该属性可以命名)具有一个名为Name的对象的属性(由于它在XAML命名空间中,因此具有X :),以便可以标识对象并对其进行引用。
结论:
名称是特定对象的属性,但是X:Name是该对象的一个属性(有一个定义通用对象的类)。
如果您有自定义控件,则X:Name可能会导致内存问题。 它将为NameScope条目保留一个存储位置。
我说除非必要,否则不要使用x:Name。
variable. 我的研究是将x:Name
作为变量。 variable. 但是, Name
为变量。 这是否意味着x:Name可以在XAML文件中的任何位置调用它,但Name不能。
例:
您无法将名称为Button
属性Content
Binding
为“ btn”,因为它位于StackPanel
之外
我总是使用x:Name变体。 我不知道这是否会影响性能,我发现它很容易,原因如下。 如果您自己的用户控件驻留在另一个程序集中,则“名称”属性并不总是足够的。 这使得粘贴x:Name属性也更加容易。
它们都是同一回事,很多框架元素本身都公开了name属性,但对于那些不包含它们的人,您可以使用x:name-我通常只坚持使用x:name,因为它适用于所有情况。
控件可以根据需要将名称本身公开为依赖项属性(因为它们需要在内部使用该依赖项属性),也可以选择不这样做。
在MSDN更多细节在这里和这里 :
一些WPF框架级别的应用程序可能能够避免使用x:Name属性,因为WPF命名空间中为几个重要基类(例如FrameworkElement / FrameworkContentElement)指定的Name依赖项属性满足了相同的目的。 仍然存在一些常见的XAML和框架方案,其中需要对不具有Name属性的元素进行代码访问,尤其是在某些动画和情节提要支持类中。 例如,如果要从代码中引用x:Name,则应在XAML中创建的时间轴和转换上指定它们。
如果Name可以作为类的属性使用,则Name和x:Name可以作为属性互换使用,但是如果在同一个元素上同时指定二者,则会导致错误。
x:Name和Name引用不同的名称空间。
x:name是对Xaml文件顶部默认定义的x名称空间的引用。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
只是说Name使用下面的默认名称空间。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
x:Name表示使用具有x别名的名称空间。 x是默认值,大多数人都保留它,但是您可以将其更改为任意值
xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"
所以您的参考将是foo:name
在WPF中定义和使用命名空间
OK,让我们以另一种方式来看待。 假设您将一个按钮拖放到Xaml页面上。 您可以通过x:name和name两种方式来引用。 所有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:Name或Name ,它们都将从FrameworkElement中访问getter / setter。
MSDN参考
WPF定义XAML处理器使用的CLR属性,以将多个CLR名称空间映射到单个XML名称空间。 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")]
它不是WPF项,而是标准XML项, BtBh正确回答了该问题,x表示默认名称空间。 在XML中,当您不为元素/属性添加名称空间前缀时,它会假定您需要默认名称空间。 因此,仅输入Name
仅仅是x:Name
的简写形式。 有关XML名称空间的更多详细信息,请参见链接文本。
XAML中实际上只有一个名称x:Name
。 通过使用类上的RuntimeNamePropertyAttribute
(将类属性之一指定为映射到XAML的x:Name
属性),可以使用WPF之类的框架将其属性之一映射到XAML的x:Name
。
这样做的原因是为了允许在运行时已经具有“名称”概念的框架,例如WPF。 例如,在WPF中, FrameworkElement
引入了Name属性。
通常,类无需存储x:Name
即可使用。 对于XAML而言,所有x:Name
意味着生成一个字段来将值存储在类后面的代码中。 运行时对该映射进行的操作取决于框架。
那么,为什么有两种方法可以做同一件事? 简单的答案是因为有两个概念映射到一个属性。 WPF希望在运行时保留一个元素的名称(可通过Bind等使用),而XAML需要知道您希望通过类后面代码中的字段访问哪些元素。 WPF通过将Name属性标记为x:Name的别名来将这两者联系在一起。
将来,XAML将更多地用于x:Name,例如允许您通过按名称引用其他对象来设置属性,但是在3.5及更低版本中,它仅用于创建字段。
您是否应该使用一个还是另一个确实是样式问题,而不是技术问题。 我将其留给他人以提出建议。
另请参见AutomationProperties.Name与VS x:Name ,辅助功能工具和某些测试工具使用AutomationProperties.Name。