XAML x:Reference和ElementName之间的区别是什么?

8qgya5xd  于 2023-03-10  发布在  其他
关注(0)|答案(3)|浏览(221)

根据MSDN上的x:Reference Markup Extension页面,x:Reference
引用在XAML标记中其他位置声明的示例。该引用引用元素的x:Name。
根据MSDN上的Binding.ElementName Property页面,ElementName
感兴趣元素的Name属性或x:Name指令的值。
回顾第一页的备注部分:

x:参考和WPF

在WPF和XAML 2006中,元素引用由ElementName绑定的框架级别功能处理。对于大多数WPF应用程序和方案,仍应使用ElementName绑定。此常规指南的例外情况可能包括存在数据上下文或其他作用域考虑因素而使数据绑定不切实际以及不涉及标记编译的情况。
为完整起见,以下是ElementName页面上备注部分的一部分:
当您要绑定到应用程序中另一个元素的属性时,此属性非常有用。例如,如果您要使用Slider控制应用程序中另一个控件的高度,或者如果您要将控件的Content绑定到ListBox控件的SelectedValue属性。
现在,虽然我完全知道什么时候以及如何使用ElementName属性,但我不完全理解它和x:Reference标记扩展之间的区别。有人能解释一下吗?特别是,扩展一下x:Reference备注部分显示的最后一句话?:
此一般指导的例外情况可能包括数据上下文或其他作用域考虑因素使数据绑定不切实际以及不涉及标记编译的情况。

kcugc4gi

kcugc4gi1#

基本上就像你说的,那两个做的几乎一样。但是引擎盖下有小的区别。
{x:Reference ...}-〉只返回一个对象的引用,它不会像binding那样在两个属性之间创建“桥梁”。在所有这些操作的背后,使用了一个服务,它在一个特定的作用域(通常是窗口本身)中搜索给定的名称。
{Binding ElementName="..." }-〉首先,它创建绑定对象,然后搜索对象名,但不是使用与x:Reference相同的技术。搜索算法在VisualTree中上下移动,以找到所需的元素。因此,始终需要一个功能强大的VisualTree。例如,当在非UiElement中使用时,它将不起作用。最后,绑定将保留下来,并完成其日常工作。
这行不通:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding ElementName=bttn1, Path=DataContext.Visibility}"/>
 ....

这是可行的:

<StackPanel>
 <Button x:name="bttn1" Visibility="Hidden">Click me</Button>
 <DataGrid>
  <DataGrid.Columns>
    <DataGridTextColumn Visibility="{Binding Source={x:Reference bttn1}, Path=DataContext.Visibility}"/>
 ....

有点像这样:)

2skhul33

2skhul332#

ElementName是特定于平台的。也就是说,它可能存在,也可能不存在,这取决于您使用的平台。x:Reference将该概念提升为XAML本机特性。因此,任何支持XAML的平台都支持x:Reference

yx2lnoni

yx2lnoni3#

到了2023年,事情似乎发生了变化。现在MS x:Reference Markup Extension page声明x:Reference***不能***用于任何编译的WPF文件:
x:Reference是在XAML 2009中定义的构造。在WPF中,可以使用XAML 2009功能,但只能用于未经过WPF标记编译的XAML。经过标记编译的XAML和BAML形式的XAML当前不支持XAML 2009语言关键字和功能。
因此,对于Build Action property in VS,应避免在任何设置为“Page”(或设置为“Compile”和其他可能的设置)的XAML文件中使用x:Reference
例如,在任何新的WPF项目中,MainWindow.xaml的"生成操作"默认设置为“Page”。

相关问题