在XAML根元素中有一个x:Name元素是什么意思?

4
我在XAML中看到了别人编写的以下UserControl声明:
<core:UserControlBase x:Class="xxxx"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:core="clr-namespace:Agn.Word.AddIn.Core.Presentation;assembly=Agn.Word.AddIn.Core" 

             x:Name="aName">

据我所知,x:Name属性用于在XAML中为变量声明者命名,以便能够从代码或XAML本身引用它。
考虑到这是根元素,我不明白为什么要使用这个名称(在后台代码中我将使用“this”,在XAML中我可以使用“RelativeSource”等)。
有什么提示吗?

2
有时候RelativeSource不太可靠,你必须使用元素名称。 - Sinatr
那么你的意思是,这种声明的唯一原因是在XAML本身中使用该名称来指向根元素。所以如果它没有被使用,我可以完全删除这个声明吗? - Ignacio Soler Garcia
如果在此“UserControl”的xaml/cs中未使用,则可以安全删除它。其他人可能会忘记删除“x:Name”(可能正在使用它,但然后更改了某些内容,可能切换到“RelativeSource”或编写附加行为而不是代码后端等)。 - Sinatr
1
这是一个无法使用RelativeSource的情况示例(而x:Name完美地工作)。 - Sinatr
1个回答

3

当您需要直接引用对象时,可以使用x:Name

唯一标识对象元素,以便从代码后端或通用代码访问实例化对象。一旦应用于支持的编程模型,x:Name 可视为持有对象引用的变量,与由构造函数返回的变量等效。

(...)

指定的 x:Name 在处理 XAML 时成为底层代码中创建的字段名称,并且该字段保存对对象的引用。

这比使用RelativeSource更高效,也会在代码后端中创建变量。

在您的示例中,如果您不想使用RelativeSource来导航层次结构,并且您也不在代码后端中使用它,则可以简单地将其删除。


3
值得一提的是,RelativeSource 使用反射来获取对象,而通过 x:Name 引用对象会更快,因为该变量位于代码后台。 - Mike Eason

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