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

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

那么,它们之间的明确区别是什么?何时使用一种优于另一种呢?

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


#1楼

它们不是同一件事。

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

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

结果,这也意味着x:Name可以在更大范围的对象上使用。 这是一种使xaml中的任何内容都能被给定名称引用的技术。


#2楼

唯一的区别是,如果将用户控件用于Same Assembly中的控件,则Name将无法标识您的控件,并且会出现错误“在同一Assembly中为控件使用x:Name”。 因此x:Name是WPF中命名控件的WPF版本。 名称仅用作Winform Legacy。 他们希望区分WPF和Winforms中控件的命名,因为他们使用Xaml中的属性来从其他使用x:表示控件名称的程序集中识别控件。

请记住,不要仅仅为了保留控件的名称而将其命名,因为它作为空白驻留在内存中,它会警告您名称已用于控件,但从未使用过。


#3楼

名称

  1. 只能用于FrameworkElement和FrameworkContentElement的后代;
  2. 可以通过SetValue()和类似属性的代码在后台进行设置。

x:名称

扫描二维码关注公众号,回复: 8520077 查看本文章
  1. 几乎可以用于所有XAML元素;
  2. 不能通过SetValue()从后台代码设置; 因为它是指令,所以只能在对象上使用属性语法进行设置。

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


#4楼

答案之一是x:name将在不同的程序语言(例如c#)中使用,而name将用于框架。 老实说,这就是我的感觉。


#5楼

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

Name表示:设置此对象的名称属性。


#6楼

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

阅读有关MSDN的更多信息...


#7楼

当您在XAML中声明Button元素时,您所引用的是Windows运行时中定义的类Button。

按钮具有许多属性,例如背景,文本,边距,.....和一个名为名称的属性。

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

通常,您不能引用匿名对象,但是在WPF框架中,XAML处理器使您可以通过对Name属性指定的任何值来引用该对象。

到现在为止还挺好。

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

结论:

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


#8楼

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

我说除非必要,否则不要使用x:Name。


#9楼

variable. 我的研究是将x:Name作为变量。 variable. 但是, Name为变量。 这是否意味着x:Name可以在XAML文件中的任何位置调用它,但Name不能。
例:

<StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />
<Button Content="Example" Name="btn" />
</StackPanel>
<TextBlock Text="{Binding Path=Content, ElementName=btn}" />

您无法将名称为Button属性Content Binding为“ btn”,因为它位于StackPanel之外


#10楼

我总是使用x:Name变体。 我不知道这是否会影响性能,我发现它很容易,原因如下。 如果您自己的用户控件驻留在另一个程序集中,则“名称”属性并不总是足够的。 这使得粘贴x:Name属性也更加容易。


#11楼

它们都是同一回事,很多框架元素本身都公开了name属性,但对于那些不包含它们的人,您可以使用x:name-我通常只坚持使用x:name,因为它适用于所有情况。

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

在MSDN更多细节在这里这里

一些WPF框架级别的应用程序可能能够避免使用x:Name属性,因为WPF命名空间中为几个重要基类(例如FrameworkElement / FrameworkContentElement)指定的Name依赖项属性满足了相同的目的。 仍然存在一些常见的XAML和框架方案,其中需要对不具有Name属性的元素进行代码访问,尤其是在某些动画和情节提要支持类中。 例如,如果要从代码中引用x:Name,则应在XAML中创建的时间轴和转换上指定它们。

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


#12楼

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:namename两种方式来引用。 所有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参考

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")]  

#13楼

它不是WPF项,而是标准XML项, BtBh正确回答了该问题,x表示默认名称空间。 在XML中,当您不为元素/属性添加名称空间前缀时,它会假定您需要默认名称空间。 因此,仅输入Name仅仅是x:Name的简写形式。 有关XML名称空间的更多详细信息,请参见链接文本。


#14楼

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。

发布了0 篇原创文章 · 获赞 0 · 访问量 2219

猜你喜欢

转载自blog.csdn.net/p15097962069/article/details/103919768