x:xaml文件中控件的名称和名称有什么区别吗?

时间:2010-07-31 17:58:10

标签: silverlight xaml silverlight-4.0 silverlight-3.0 silverlight-2.0

我是Silverlight的新手 当我使用Visual Studio向我的xaml文件添加一些控件时,它使用Name属性设置控件名称,但也有x:Name。
是否存在差异以及何时使用它们? 感谢。

3 个答案:

答案 0 :(得分:12)

简介

是的,有区别。底线是x:Name可以用于没有自己Name属性的对象元素。

更长的解释

您只能在表示实际具有Name属性的对象的元素上使用Name。例如,任何派生自FrameworkElement

的内容

x:Name属性可以放在任何表示对象的元素上,无论该对象是否实际具有Name属性。如果对象确实具有Name属性,则x:Name的值将分配给它,因此您不能在同一元素上同时拥有x:NameName。< / p>

当对象具有Name属性或x:Name属性时,该属性的值与对象树中的对象条目相关联。通过对象树,FindName的{​​{1}}方法可以找到一个对象。 FrameworkElement可以按名称查找对象,即使该对象没有自己的FindName属性,因为它使用对象树中记录的名称。

Name的自动生成代码将包含具有UserControlName属性的任何元素的字段定义。生成的x:Name方法将使用InitialiseComponent方法为这些字段指定值。

示例

                                           

上述Xaml会创建两个FindName类型LayoutRootGrid类型MyBrush。如果您要将SolidColorBrush更改为x:Name="LayoutRoot",则不会更改任何内容。 Name="LayoutRoot"具有Grid属性。但请尝试将Name更改为x:Name="MyBrush"。这不起作用,因为Name="MyBrush"没有名称属性。使用上面的Xaml,您可以像这样执行代码: -

SolidColorBrush

打开 public MainPage() { InitializeComponent(); MyBrush.Color = Colors.LightGray; } 的定义并查看自动生成的代码。

答案 1 :(得分:2)

不,你不能同时使用它们。 x:Name是XAML预处理器实际使用的名称,Name只是在FrameworkElement类上提供的一个convience属性来设置它。

来自MSDN reference

如果Name可用作元素的属性,则Name和x:Name可以互换使用,但如果在同一元素上指定了两个属性,则会产生错误。

答案 2 :(得分:1)

简短回答:如果您在XAML中编写内容,最好只使用x:名称。

答案很长:之前的回答提到Name是访问x:Name的“convienience”属性。那是对的。但是,现在Visual Studio和Expression系列中XAML的工具环境已经非常成熟,并且您看到越来越多的工具生成的XAML,您可能也会看到越来越多的x:Name而不是Name。这些工具更喜欢x:Name,因为这样他们就没有采取有点风险的依赖(可能特定于框架)re:x:Name和Name是如何真的相同,并且他们不需要在设置Name之间进行翻转恰好是一个FrameworkElement,然后是x:在Storyboard之类的名字上生成一个二元性,如果你通过类似DOM的东西来看这个XAML。换句话说,XAML中的“Name”属性实际上比原始API设计中设想的“方便”要少得多。 “方便”的一部分是不必映射x:,但是你必须为x:Class做到这一点,现在几乎每个人都习惯于有效地使用x:属性和XAML标记的一般原则。 / p>

我不确定VS鼓励使用Name的原始海报所做的陈述。是的,名称显示为智能感知选项,但x:名称也是如此。我在模板中看到一个对象被赋予起始名称的所有情况都使用x:Name甚至大多数都是FrameworkElements。