【问题标题】:Is there any difference in x:name and name for controls in xaml file?xaml 文件中控件的 x:name 和 name 有什么区别吗?
【发布时间】:2010-07-31 17:58:09
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

简介

是的,有区别。最重要的是,x:Name 可用于自身不具有 Name 属性的对象元素。

更长的解释

您只能在一个元素上使用Name,该元素代表一个实际上确实具有Name 属性的对象。例如从FrameworkElement 派生的任何内容。

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

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

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

示例

上面的 Xaml 创建了两个类型为 Grid 的字段 LayoutRoot 和类型为 SolidColorBrush 的 MyBrush。如果您将x:Name="LayoutRoot" 更改为Name="LayoutRoot",那不会有任何改变。 Grid 有一个 Name 属性。但是尝试将x:Name="MyBrush" 更改为Name="MyBrush"。这不起作用,因为 SolidColorBrush 没有 name 属性。使用上面的 Xaml,您可以执行如下代码:-

    public MainPage()
    {
        InitializeComponent();
        MyBrush.Color = Colors.LightGray;
    }

打开InitializeComponent的定义,看看自动生成的代码。

【讨论】:

  • 所以,我们宁愿使用x:Name 而不是Name 以确保命名始终有效,让我们不必怀疑控件是否支持 Name 属性。我说的对吗?
  • @Nam:是的,我倾向于这样做,这也有助于让事情看起来一致。
【解决方案2】:

不,您不能同时使用它们。 x:Name 是 XAML 预处理器实际使用的内容,而 Name 只是 FrameworkElement 类上提供的用于设置它的便利属性。

来自MSDN reference:

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

【讨论】:

    【解决方案3】:

    简短回答:如果您使用 XAML 编写内容,最好始终使用 x:Name。

    长答案:先前的答案提到 Name 是访问 x:Name 的“方便”属性。这是正确的。但是,现在 Visual Studio 和 Expression 系列中的 XAML 工具环境已经真正成熟,并且您看到越来越多的工具生成的 XAML,您可能还会看到越来越多的 x:Name 而不是 Name。这些工具更喜欢 x:Name 因为这样他们就不会采取有点冒险的依赖关系(可能特定于框架)re:x:Name 和 Name 是如何真正相同的,并且它们不需要在设置 Name 之间切换碰巧是一个 FrameworkElement,然后是故事板之类的 x:Name,如果您要通过 DOM 之类的东西查看此 XAML,则会生成对偶性。换句话说,XAML 中的“名称”属性现在使用起来确实比原始 API 设计中所设想的要“方便”得多。 “方便”的一部分是不必映射 x:,但无论如何您都必须为 x:Class 这样做,而且现在几乎每个人都已经习惯了有效地使用 x: 属性和 XAML 标记的一般原则。

    我不确定 VS 鼓励使用 Name 的原始发帖人的声明。是的,名称显示为智能感知选项,但 x:Name 也是如此。我在模板中看到的所有给对象指定起始名称的情况都使用 x:Name,即使其中大部分是 FrameworkElements。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2014-07-19
      相关资源
      最近更新 更多