我是Silverlight的新手
当我使用Visual Studio向我的xaml文件添加一些控件时,它使用Name属性设置控件名称,但也有x:Name。
是否存在差异以及何时使用它们?
感谢。
答案 0 :(得分:12)
简介
是的,有区别。底线是x:Name
可以用于没有自己Name
属性的对象元素。
更长的解释
您只能在表示实际具有Name
属性的对象的元素上使用Name
。例如,任何派生自FrameworkElement
。
x:Name
属性可以放在任何表示对象的元素上,无论该对象是否实际具有Name
属性。如果对象确实具有Name
属性,则x:Name
的值将分配给它,因此您不能在同一元素上同时拥有x:Name
和Name
。< / p>
当对象具有Name
属性或x:Name
属性时,该属性的值与对象树中的对象条目相关联。通过对象树,FindName
的{{1}}方法可以找到一个对象。 FrameworkElement
可以按名称查找对象,即使该对象没有自己的FindName
属性,因为它使用对象树中记录的名称。
Name
的自动生成代码将包含具有UserControl
或Name
属性的任何元素的字段定义。生成的x:Name
方法将使用InitialiseComponent
方法为这些字段指定值。
示例强>
上述Xaml会创建两个FindName
类型LayoutRoot
和Grid
类型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属性来设置它。
如果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。