标题说明了一切。有时似乎这些Name和x:Name属性是可以互换的。
那么,它们之间的明确区别是什么,什么时候最好使用一个呢?
是否有任何性能或内存暗示以错误的方式使用它们?
编辑 答复迄今表明,使用x:Name所有的时间工作正常,但我仍然想知道是什么区别。微软把这两个属性放到了WPF的第一个版本中,所以必须有一些合理的解释。
它们不是同一样东西。
x:Name是一个xaml概念,主要用于引用元素。当你给一个元素x:Name xaml属性时,“指定x:Name变成当处理xaml时在底层代码中创建的字段的名称,并且该字段保存对该对象的引用。(MSDN)所以,这是一个设计器生成的字段,默认情况下具有内部访问权限。
Name是a的现有字符串属性FrameworkElement,以xaml属性的形式列示为任何其他wpf元素属性。
因此,这也意味着x:Name可以用于更广泛的对象。这是一种使xaml中的任何内容都能被给定名称引用的技术。
在XAML中真的只有一个名字了x:Name。像WPF这样的框架可以x:Name通过使用RuntimeNamePropertyAttribute指定其中一个类属性的类作为映射到XAML的x:Name属性来选择性地将其一个属性映射到XAML。
这样做的原因是允许在运行时已经具有“名称”的框架,比如WPF。在WPF中,例如,FrameworkElement引入了一个Name属性。
通常,一个类不需要存储名称以便x:Name可用。x:NameXAML的所有手段是生成一个字段来将值存储在类后面的代码中。运行时对该映射的作用是依赖于框架的。
那么,为什么有两种方法来做同样的事情呢?简单的答案,因为有两个概念映射到一个属性。WPF希望在运行时保留一个元素的名字(通过绑定等),XAML需要知道你想要通过类后面的代码中的字段访问哪些元素。WPF通过将Name属性标记为x:Name的别名,将这两者联系在一起。
在将来,XAML将会有更多的用途来使用x:Name,比如允许你通过名字来引用其他对象来设置属性,但是在3.5和之前的版本中,它只用于创建字段。
无论你是应该使用这一个还是另一个,都是一个真正的风格问题,而不是技术问题。我会把这个留给别人去推荐。