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

那么,它们之间的明确区别是什么,什么时候更适合使用其中一种呢?

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

有帮助吗?

解决方案

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

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

在一般情况下,一类不需要存储的名称为x:Name是可用的。所有x:Name装置XAML是生成字段来存储在后面类的代码的值。什么运行时不与该映射是框架依赖

那么,为什么有两种方法可以做同样的事情?答案很简单,因为有映射到一个属性两个概念。 WPF要在运行时保留的元素(这是通过使用绑定,除其他事项外)和XAML需要知道你想在背后类的代码字段访问哪些元素的名称。 WPF通过标记的名称属性作为x的一个别名捆绑在一起这两个:名称

在未来,XAML将有更多的用途×:名称,例如允许你通过参照由名字的其他对象来设置属性,但在3.5和之前,它仅用于创建字段

你是否应该使用一个或另一个是一个真正的风格问题,不是技术问题。我会留给其他人的建议。

请参阅也 AutomationProperties.Name VS X:名称,AutomationProperties.Name使用辅助功能工具和一些测试工具。

其他提示

他们是不一样的东西。

x:Name是XAML概念,主要用于参考元件。当你给一个元素的X:名称XAML属性,“指定的x:Name变成了在底层代码时XAML处理创建的字段的名称,以及字段保存到对象的引用。” ( MSDN )所以,这是一个设计师生成的场,其具有通过默认的内部连接。

NameFrameworkElement的现有串属性,列为一个XAML属性的形式的任何其它WPF元素属性。

其结果是,这也意味着可以x:Name于更大范围的对象的使用。这是一个使在XAML任何由一个给定名称引用的技术。

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

x:姓名 是对 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:名称

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


好吧,让我们以不同的方式来看待这个问题。假设您将一个按钮拖放到 Xaml 页面上。你可以参考这2种方式 x:姓名姓名. 。全部 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" are 是对多个命名空间的引用。自从 xaml 持有 控制 命名空间(不是 100%)和 推介会 持有 框架元素按钮类 具有以下继承模式:

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

因此,正如人们所期望的那样,任何从 FrameworkElement 继承的东西都可以访问其所有公共属性。因此,对于 Button 来说,它从层次结构树最顶层的 FrameworkElement 获取其 Name 属性。 所以 你可以说 x:姓名 或者 姓名 他们都将从 FrameworkElement 访问 getter/setter。

MSDN 参考

WPF 定义了 XAML 处理器使用的 CLR 属性,以便将多个 CLR 命名空间映射到单个 XML 命名空间。这 Xmlns定义属性 属性放置在生成程序集的源代码中的程序集级别。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 因为它适用于所有内容。

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

更多详细信息请参见msdn 这里这里:

某些WPF框架级别的应用程序可能能够避免使用x:名称属性,因为对于几个重要基类(例如Frameworkelement/frameworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkworkwork- everation一下时间属性)。仍然有一些常见的XAML和框架方案,其中代码访问没有名称属性的元素是必要的,最著名的是在某些动画和情节板支持类中。例如,如果您打算从代码引用它们,则应在时间表上指定x:名称,并在XAML中创建的转换。

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

X:名称可能会导致内存问题,如果你有自定义控件。它会保持一个存储位置对NameScope项。

我说从来没有使用X:除非你有名称

唯一的区别是,如果你使用的用户控件到从同一个程序的控制则名称将无法识别你的控制,你会得到一个错误“使用X:名称在同一大会的控制”。 因此,X:名称在WPF命名控件的WPF版本。名字只是作为一个WinForm遗产。他们想,因为他们使用属性在XAML来识别从他们使用X其他组件控件来区分的WPF和WinForms控件的命名:控制的名称。

只要记住不要把名字控制只是因为它驻留在内存中为空白保持它的缘故,它会给你一个名称已申请的击打其从未使用过控制警告。

姓名:

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

x:姓名:

  1. 可用于几乎所有 XAML 元素;
  2. 无法通过setValue()从代码主题设置;它只能使用对象上的属性语法设置,因为它是指令。

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

x:Name是指:在代码创建一个字段后面容纳到该对象的引用

Name意味着:设置该对象的名称属性

我总是使用x:名称变体。 我不知道如果这会影响任何性能,我只是觉得很容易,原因如下。 如果您有位于另一个装配自己的用户控件只是“名称”属性通常是不够的。这使得它更容易只是坚持太X:Name属性

这不是一个WPF项目,而是一个标准的XML之一, BtBh 正确地回答了这个问题,X指的是默认的命名空间。在XML当你不使用前缀命名空间的元素/属性它假定你想要的默认命名空间。 所以,键入只是Name无非是短手x:Name更多。有关XML命名空间的更多细节可以在链接文本

答案之一是,X:名称是不同的程序语言内使用,如C#和名称将被用于所述框架。老实说,这是它听起来像我的。

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

按钮有很多属性,如背景,文本,边距,......和一个名为“名称”的属性。

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

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

到目前为止,一切都很好。

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

结论:

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

指定的 X:名称变成了在底层代码时XAML处理创建的字段的名称,以及字段保存到对象的引用。在Silverlight中,使用管理API,由目标的MSBuild步骤,这也负责为XAML文件和它的代码隐藏接合部分类进行创建此字段的过程。不一定是XAML语言指定的这种行为;它是特定的实现,Silverlight的应用到使用 X:在编程和应用模型名称

更多MSDN上...

我的研究x:Name全球的变量。然而,如Name本地的变量。这是否意味着X:名称,你可以在任何地方调用它在你的XAML文件,但名称不结果。 例如:

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

您不能Binding与名称Content财产Button是 “BTN”,因为它外面StackPanel

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top