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

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

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

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

编辑回应到目前为止表明,使用x:Name一直工作正常,但我仍然想知道是什么区别。 微软把这两个属性放到了WPF的第一个版本中,所以必须有一些合理的解释。

XAML中只有一个名称,即x:Name 。 像WPF这样的框架可以通过使用指定其中一个类属性的RuntimeNamePropertyAttribute作为映射到XAML的x:Name属性来将其一个属性映射到XAML的x:Name。

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

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

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

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

无论你是应该使用这一个还是另一个,都是一个真正的风格问题,而不是技术问题。 我会把这个留给别人去推荐。

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

他们不是一回事。

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

NameFrameworkElement的现有string属性,以xaml属性的forms列出为任何其他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中定义和使用名称空间

编辑:

好的,让我们看看这个不同的方式。 假设您将一个button拖放到您的Xaml页面上。 你可以引用这2种方法:名称名称 。 所有xmlns =“http://schemas.microsoft.com/winfx/2006/xaml/presentation”; xmlns:x =“http://schemas.microsoft.com/winfx/2006/xaml”;是对多个命名空间的引用。 由于xaml拥有控制名称空间(不是100%),并且演示文稿包含FrameworkElement ,并且Button类具有inheritance模式:

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

所以,正如人们期望从FrameworkElementinheritance的任何东西都可以访问它的所有公共属性。 所以在Button的情况下,它从层次结构树顶部的FrameworkElement获取它的Name属性。 所以你可以说x:NameName ,它们都将从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")] 

它们都是一样的,很多框架元素自己公开一个名称属性,但是对于那些不能使用x:name的用户,我通常只使用x:name,因为它适用于一切。

如果他们想(因为他们需要在内部使用该DP),控制可以将自己的名字作为DP来公开,或者他们可以select不这样做。

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

某些WPF框架级应用程序可能能够避免使用x:Name属性,因为WPF名称空间中为几个重要基类(如FrameworkElement / FrameworkContentElement)指定的Name依赖项属性可以满足相同的目的。 还有一些常见的XAML和框架场景,其中代码访问不具有Name属性的元素是必要的,最显着的是在某些animation和故事板支持类中。 例如,如果您打算从代码中引用它们,则应该在时间轴上指定x:Name,并在XAML中创build转换。

如果Name作为类的属性可用,则Name和x:Name可以互换使用作为属性,但是如果在同一个元素上指定了两个名称,则会导致错误。

X:名称可能导致内存问题,如果您有自定义控件。 它将为NameScope条目保留一个内存位置。

我说永远不要使用x:Name,除非你必须。

唯一的区别是,如果您将用户控件用于来自同一个程序集的控件,那么名称将不会识别您的控件,并且您将在“在同一程序集中使用控件的x:名称”出现错误。 所以x:Name是WPF中命名控件的WPF版本控制。 名称仅用作Winform Legacy。 他们希望区分WPF和winforms中控件的命名,因为它们使用Xaml中的属性来识别其他使用x:的控件的控件。

只要记住不要把一个控件的名字,只是为了保持它,因为它驻留在内存中作为一个空白,它会给你一个警告,名称已被应用于控件,但它从来没有使用过。

姓名

  1. 只能用于FrameworkElement和FrameworkContentElement的后代;
  2. 可以通过SetValue()和类似属性从代码隐藏中设置。

x:名称

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

对于一个FrameworkElement或FrameworkContentElement,在XAML中使用这两个指令都将导致一个exception:如果XAML是标记编译的,那么将在标记编译中发生exception,否则会在加载时发生。

我总是使用x:Name变体。 我不知道这是否会影响任何performance,我只是觉得更容易出于以下原因。 如果你有自己的用户控件驻留在另一个程序集中,那么只有“名称”属性并不总是足够的。 这使得更简单的粘贴x:Name属性。

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

Name意思是:设置这个对象的name属性。

这不是一个WPF项目,而是一个标准的XML项目,而BtBh已经正确地回答了它,x是指默认的名称空间。 在XML中,当你不给一个名称空间添加一个元素/属性时,它假定你需要默认的名称空间。 所以只需inputName ,只不过是x:Name的简写。 关于XML命名空间的更多细节可以在链接文本中find

其中一个答案就是x:name被用在不同的程序语言(比如c#)中,而name则被用于框架。 老实说,这是我听起来像。

指定的x:Name成为处理XAML时在基础代码中创build的字段的名称,并且该字段包含对该对象的引用。 在Silverlight中,使用托pipeAPI,创build此字段的过程由MSBuild目标步骤执行,该目标步骤还负责joinXAML文件及其代码隐藏的部分类。 这种行为不一定是XAML语言指定的; 这是Silverlight在其编程和应用程序模型中使用x:Name的特定实现。

阅读更多关于MSDN …

当你在XAML中声明一个Button元素时,你指的是一个在Windows运行时定义的类,称为Button。

button具有许多属性,如背景,文本,边距,以及名为Name的属性。

现在,当你在XAML中声明一个Button就像创build一个名为Name的属性的匿名对象。

一般而言,您不能引用匿名对象,但在WPF框架中,XAML处理器使您可以通过给Name属性赋予的任何值引用该对象。

到现在为止还挺好。

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

结论:

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