{x:Reference}
是XAML中的一个标记扩展(Markup Extension),它的作用很简单但很重要:获取对XAML中另一个命名元素的引用。
基本语法
{x:Reference 元素名称}
作用详解
1. 在绑定中引用其他元素
这是最常见的用法,替代 ElementName
:
<StackPanel><Slider x:Name="mySlider" Minimum="0" Maximum="100"/><TextBox Text="{Binding Path=Value, Source={x:Reference mySlider}}"/>
</StackPanel>
2. 在任何需要对象引用的地方使用
{x:Reference}
不限于绑定,可以在任何需要对象引用的属性中使用:
<StackPanel><Button x:Name="btn1" Content="按钮1"/><!-- 将btn2的CommandTarget设置为btn1 --><Button Content="按钮2" CommandTarget="{x:Reference btn1}"Command="ApplicationCommands.Copy"/>
</StackPanel>
与 ElementName 的对比
使用 ElementName
:
<TextBox Text="{Binding Value, ElementName=mySlider}"/>
使用 {x:Reference}
:
<TextBox Text="{Binding Value, Source={x:Reference mySlider}}"/>
两者效果相同,但 {x:Reference}
更灵活:
优势场景
1. 在非绑定场景中使用
<Grid><TextBlock x:Name="titleText" Text="标题"/><!-- 将ToolTip的PlacementTarget设置为titleText --><Button Content="帮助" ToolTip="{x:Reference titleText}"ToolTipService.PlacementTarget="{x:Reference titleText}"/>
</Grid>
2. 在样式中使用
<Style TargetType="TextBox"><Setter Property="Text" Value="{Binding Value, Source={x:Reference SomeSlider}}"/>
</Style>
3. 引用非直接相关的元素
<Grid><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Slider x:Name="mainSlider" Grid.Row="0"/><StackPanel Grid.Row="1"><!-- 引用不同面板中的元素 --><TextBox Text="{Binding Value, Source={x:Reference mainSlider}}"/></StackPanel>
</Grid>
注意事项
1. 引用必须在同一名称范围内
<!-- 这样是OK的 -->
<Window><Slider x:Name="slider1"/><TextBox Source="{x:Reference slider1}"/>
</Window><!-- 这样可能有问题 -->
<Window><UserControl><Slider x:Name="slider1"/></UserControl><!-- 这里可能引用不到slider1,因为名称范围不同 --><TextBox Source="{x:Reference slider1}"/>
</Window>
2. 避免循环引用
<!-- 错误:循环引用 -->
<TextBox x:Name="text1" Text="{Binding Text, Source={x:Reference text1}}"/>
总结
{x:Reference}
就是XAML中的"取地址符"或"引用符",它:
- 作用:按名称获取XAML元素的引用
- 用途:在绑定、命令目标、样式等各种场景中引用其他元素
- 优势:比
ElementName
更灵活,可用于非绑定场景 - 限制:被引用的元素必须有
x:Name
且在同一个名称范围内
理解 {x:Reference}
有助于你更深入地掌握XAML的引用机制!