在XAML中使用Label.Target,我们通常需要一个数据绑定来设置一个已命名的对象。这样不仅需要给对应控件加入名称,同时还得用数据绑定来把Target属性和对应控件联系起来,比如这样:
<Label Target="{Binding ElementName=tbx}">姓名(_N)</Label>
<TextBox Name="tbx"/>
其实可以创造一些东西使整个过程更快捷一些,比如用Style和HeaderedContentControl。HeaderedContentControl继承自ContentControl加了Header的相关属性。就用这个Header来正好作为Label控件的Content。注意在HeaderedContentControl的Style中通过数据绑定将ContentPresenter.Content设置成Label.Target。
如下代码:
<Style x:Key="ControlBlock" TargetType="HeaderedContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="HeaderedContentControl">
<DockPanel>
<Label Content="{TemplateBinding Header}"
DockPanel.Dock="Top"
Target="{Binding Content, ElementName=content}"/>
<!-- 将ContentPresenter.Content设置成Label.Target -->
<ContentPresenter Name="content"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
使用起来直接定义HeaderedContentControl就可以了:
<HeaderedContentControl Style="{StaticResource ControlBlock}"
Header="姓名(_N)">
<TextBox/>
</HeaderedContentControl>
OK: