Name和x:Name属性是可以互换的。那它们之间的确切区别是什么,使用其中一个比另一个更好呢?如果使用方式不当会有性能或内存方面的影响吗?Name和x:Name属性是可以互换的。那它们之间的确切区别是什么,使用其中一个比另一个更好呢?如果使用方式不当会有性能或内存方面的影响吗?x:Name。框架(如 WPF)可以使用 RuntimeNamePropertyAttribute 在类上指定属性映射到 XAML 的 x:Name,从而将其属性映射到 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 被辅助工具和某些测试工具使用。x:Name,因为 Name 无法创建可在代码后台中识别的字段。尽管如此,我仍然不知道为什么会发生这种情况。 - LiborName还是x:Name都没有任何区别,成员将在任何情况下正确生成。这是因为“FrameworkElement”被装饰了[RuntimeNameProperty("Name")]。 - bitbonk它们不是同一件事情。
x:Name 是一个 XAML 的概念,主要用于引用元素。当您给一个元素设置 x:Name 属性时,“指定的 x:Name 成为处理 XAML 时在底层代码中创建的字段的名称,该字段保存对对象的引用。”(MSDN) 因此,这是一个由设计生成的字段,默认情况下具有内部访问权限。
Name 是 FrameworkElement 的现有字符串属性,以 XAML 属性的形式列出,就像其他 WPF 元素属性一样。
因此,这也意味着 x:Name 可以用于更广泛的对象。这是一种技术,使 XAML 中的任何东西都能被给定名称引用。
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
好的,让我们以不同的方式来看待这个问题。比如说,你将一个按钮拖放到你的Xaml页面上。你可以通过两种方式引用它:x:name和name。所有的xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"和xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"都是对多个命名空间的引用。由于xaml包含了Control命名空间(不确定是否完全正确),而presentation则包含了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。
WPF定义了一个CLR属性,由XAML处理器消耗,以将多个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")]
http://schemas.microsoft.com/winfx/2006/xaml并不包含Control,因为你可以在XAML中直接使用它而不需要x命名空间:<Control />。 - Drew Noakes如果Name在类上可用作属性,则可以将Name和x:Name互换使用作为属性,但如果在同一元素上同时指定两者,则会导致错误。
X:Name(名称)可能会导致内存问题,特别是当您使用自定义控件时。它会为NameScope条目保留一个内存位置。
我建议除非必须,否则不要使用x:Name。
FrameworkElement.RegisterName("elementname") 在没有名称的元素上重现代码问题。但是,如果您调用 FrameworkElement.UnregisterName("elementname"),它可以被“取消引用”。 - Adam Caviness名称:
x:Name:
在XAML中同时使用这两个指令会导致异常:如果XAML是标记编译的,则异常将发生在标记编译过程中,否则它会在加载时发生。
x:Name的意思是:在代码后台创建一个字段来保存对该对象的引用。
Name的意思是:设置该对象的名称属性。
我总是使用x:Name变量。 我不知道这是否会影响性能,但我发现它更容易实现以下功能。 如果您拥有自己的用户控件,这些控件驻留在另一个程序集中,仅使用“名称”属性可能不足以满足需求。因此,使用x:Name属性更加方便。
x:Name是有效的。我不得不将其更改为Name,否则我无法在我的 .xaml.cs 代码中引用控件,因此我假设它不再是始终有效的情况。 - Ortund