C# WPF {x:Reference}的作用
{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的引用机制!

浙公网安备 33010602011771号