有时,Name和x:Name属性似乎是可互换的。

那么,它们之间的决定性区别是什么?什么时候使用一种比另一种更可取?

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


当前回答

名称:

只能用于FrameworkElement和FrameworkContentElement的后代; 可以通过SetValue()和property-like在代码后面设置。

x:名称:

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

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

其他回答

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

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

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

一般来说,你不能引用一个匿名对象,但是在WPF框架中,XAML处理器允许你通过给Name属性的任何值来引用该对象。

到目前为止一切顺利。

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

结论:

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

其中一个答案是x:name将在不同的程序语言中使用,如c#,而name将用于框架。说实话,我听起来就是这样。

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

我建议除非迫不得已,否则不要使用x:Name。

唯一的区别是,如果你在同一个程序集中使用用户控件到一个控件中,那么Name将不能识别你的控件,你将得到一个错误“在同一个程序集中使用x:Name控件”。 所以x:Name是WPF中命名控件的WPF版本。Name只是用作Winform Legacy。他们想在WPF和winforms中区分控件的命名,因为他们使用Xaml中的属性来标识控件与其他程序集,他们使用x:表示控件的名称。

请记住,不要为控件命名,因为它在内存中是空白的,它会给你一个警告,说明名称已应用于控件,但它从未使用过。

我总是使用x:Name变量。 我不知道这是否会影响性能,我只是觉得它更容易,原因如下。 如果您有自己的用户控件驻留在另一个程序集中,只有“Name”属性并不总是足够的。这使得使用x:Name属性更加容易。