在XAML文件中,控件的x:name和name有什么区别吗?

6

我是Silverlight的新手。
当我使用Visual Studio向我的xaml文件添加一些控件时,它会使用Name属性设置控件的名称,但也有x:Name。
它们有什么区别,何时使用每个属性?
谢谢。


可能是在WPF中,x:Name和Name属性有什么区别?的重复问题。 - Ian Ringrose
1
非常接近,但这个是针对Silverlight的,不确定在4年后是否重要 :) - Samvel Siradeghyan
3个回答

13

简而言之

是的,x:Name和Name之间有区别。关键在于,x:Name可以用于没有自己的Name属性的对象元素。

更详细的解释

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

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

当对象具有Name属性或x:Name属性时,该属性的值将与对象在对象树中的条目相关联。通过对象树,FrameworkElementFindName方法可以找到对象。即使该对象不carry有自己的Name属性,FindName也可以通过使用对象树中记录的名称来查找对象。

UserControl的自动生成代码将包含对具有Namex:Name属性的任何元素的字段定义。生成的InitializeComponent方法将使用FindName方法为这些字段分配值。

示例

上述Xaml创建了两个字段,类型分别为GridSolidColorBrushLayoutRootMyBrush。如果将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
@Nam:是的,我倾向于这样做,这也有助于让事物看起来一致。 - AnthonyWJones

2
不,你不能同时使用它们两个。x:Name 是 XAML 预处理器实际使用的,而 Name 只是 FrameworkElement 类上提供的一个方便属性来设置它。
根据 MSDN 的参考文献:
如果 Name 作为元素的属性可用,则可以交替使用 Name 和 x:Name,但如果在同一元素上指定了这两个属性,则会出现错误。

1

简短回答:如果您在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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接