我是Silverlight的新手。
当我使用Visual Studio向我的xaml文件添加一些控件时,它会使用Name属性设置控件的名称,但也有x:Name。
它们有什么区别,何时使用每个属性?
谢谢。
我是Silverlight的新手。
当我使用Visual Studio向我的xaml文件添加一些控件时,它会使用Name属性设置控件的名称,但也有x:Name。
它们有什么区别,何时使用每个属性?
谢谢。
简而言之
是的,x:Name和Name之间有区别。关键在于,x:Name
可以用于没有自己的Name
属性的对象元素。
更详细的解释
只能在表示实际拥有Name
属性的对象的元素上使用Name
。例如,任何从FrameworkElement
派生的东西。
x:Name
属性可以放置在代表任何对象的任何元素上,无论该对象是否实际拥有Name
属性。如果对象确实具有Name
属性,则将x:Name
的值分配给它,因此您不能在同一元素上同时使用x:Name
和Name
。
当对象具有Name
属性或x:Name
属性时,该属性的值将与对象在对象树中的条目相关联。通过对象树,FrameworkElement
的FindName
方法可以找到对象。即使该对象不carry有自己的Name
属性,FindName
也可以通过使用对象树中记录的名称来查找对象。
UserControl
的自动生成代码将包含对具有Name
或x:Name
属性的任何元素的字段定义。生成的InitializeComponent
方法将使用FindName
方法为这些字段分配值。
示例
上述Xaml创建了两个字段,类型分别为Grid
和SolidColorBrush
的LayoutRoot
和MyBrush
。如果将x:Name="LayoutRoot"
更改为Name="LayoutRoot"
,则不会发生任何变化。Grid
具有Name
属性。但是,尝试将x:Name="MyBrush"
更改为Name="MyBrush"
是行不通的,因为SolidColorBrush
没有名称属性。使用上面的Xaml,您可以编写如下代码:-
public MainPage()
{
InitializeComponent();
MyBrush.Color = Colors.LightGray;
}
打开InitializeComponent
的定义并查看自动生成的代码。
x:Name
而不是 Name
,以确保命名始终有效,并使我们摆脱对控件是否支持 Name 属性的疑虑。我说得对吗? - Nam G VU简短回答:如果您在XAML中编写内容,最好始终使用x:Name。
长篇回答:之前的回答提到Name是访问x:Name的“方便”属性。这是正确的。然而,现在Visual Studio和Expression系列中的XAML工具环境已经非常成熟,您可能会看到越来越多由工具生成的XAML,因此您也可能会看到越来越多的x:Name而不是Name。工具更喜欢x:Name,因为这样他们就不需要采用一种有风险的依赖关系(可能特定于框架)来处理x:Name和Name实际上是相同的问题,而且他们不需要在某些情况下将Name设置为FrameworkElement,然后在像Storyboard这样的对象上设置x:Name并生成一个二元组,如果您通过DOM之类的方式查看此XAML,则会出现这种情况。换句话说,在现今的API设计中,“Name”属性在XAML中的使用方式确实比原先设想的要不那么“方便”。其中一部分“方便”的原因是不必映射x:,但是您仍然必须为x:Class进行映射,而且现在几乎每个人都已经习惯了有效地使用x:属性和XAML标记的一般原则。
我不确定原帖作者所说的VS鼓励使用Name的说法。是的,Name出现在智能感知选项中,但x:Name也是如此。而我在模板中看到的所有情况,都是在给对象赋予起始名称时使用x:Name,即使其中大多数是FrameworkElements。