x:Reference和ElementName有什么区别?

根据MSDN上的x:Reference Markup Extension页面, x:Reference

引用在XAML标记中其他地方声明的实例。 引用是指元素的x:Name。

根据MSDN上的Binding.ElementName属性页面, ElementName

名称属性的值或x:感兴趣的元素的名称指令。

回头看第一页的备注部分:

x:引用和WPF

在WPF和XAML 2006中,元素引用由ElementName绑定的框架级function来解决。 对于大多数WPF应用程序和场景,仍应使用ElementName绑定。 这个通用指南的例外情况可能包括数据上下文或其他范围的考虑使数据绑定不切实际以及不涉及标记编译的情况。

为了完整ElementNameElementName页面上备注部分的一部分:

当你想绑定到应用程序中另一个元素的属性时,这个属性是很有用的。 例如,如果要使用滑块来控制应用程序中另一个控件的高度,或者如果要将控件的内容绑定到ListBox控件的SelectedValue属性。

现在,虽然我完全了​​解何时以及如何使用ElementName属性,但我并不完全了解它与x:Reference标记扩展之间的区别。 任何人都可以解释这一点,特别是扩展在x:Reference备注部分显示的最后一句话吗?

这个通用指南的例外情况可能包括数据上下文或其他范围的考虑使数据绑定不切实际以及不涉及标记编译的情况。

基本上就像你说的那样,两者差不多。 然而,有一些小的区别。

{x:Reference ...} – >只返回一个对象的引用,它不会创build像绑定这样的两个属性之间的“桥接”。 在所有正在使用的服务之后,在通常是窗口本身的特定范围内search给定的名称。

{Binding ElementName="..." } – >首先它创build绑定对象,然后它search对象名称,但不是使用与x:Reference相同的技巧。 searchalgorithm在VisualTree中向上和/或向下移动以find所需的元素。 因此总是需要一个function性的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}"/> .... 

有点像:)

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