这实际上比看起来要困难得多。在 WPF 中,标签不是 TextBlock。它派生自 ContentControl,因此可以在其 Content 集合中托管其他非文本控件。
但是,您可以指定一个字符串作为内容,如下例所示。在内部,将构造一个 TextBlock 来为您托管文本。
<Label Content="Test!"/>
这在内部翻译为:
<Label>
<Label.Content>
<TextBlock>
Test!
</TextBlock>
</Label.Content>
</Label>
对此的简单解决方案是将 TextBlock 的 TextDecorations 属性作为附加属性。例如,FontSize 就是这样设计的,因此以下内容有效:
<Label TextBlock.FontSize="24">
<Label.Content>
<TextBlock>
Test!
</TextBlock>
</Label.Content>
</Label>
TextBlock.FontSize 附加属性可以应用于可视化树中的任何位置,并将覆盖树中任何 TextBlock 后代上该属性的默认值。然而,TextDecorations 属性并不是这样设计的。
这至少给你留下了一些选择。
- 使用颜色、边框、光标等,而不是带下划线的文本,因为这 100% 更容易实现。
- 更改执行此操作的方式以将样式应用到 TextBlock。
- 不厌其烦去创造你自己的附属财产 http://alexshed.spaces.live.com/blog/cns!71C72270309CE838!139.entry以及遵守它的控制模板。
- 执行如下操作来嵌套显示为样式子项的 TextBlock 的样式:
仅供参考,这是迄今为止我在 WPF 中做过的最丑陋的事情,但它确实有效!
<Style x:Key="ActionLabelStyle" TargetType="{x:Type Label}">
<Setter Property="Margin" Value="10,3" />
<Setter Property="Padding" Value="0" />
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
<Setter Property="FontFamily" Value="Calibri" />
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsEnabled" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Background" Value="Red" />
</MultiTrigger>
</Style.Triggers>
<Style.Resources>
<Style TargetType="TextBlock">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Label}, Path=IsMouseOver}" Value="True" />
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="TextDecorations" Value="Underline"/>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Style.Resources>
</Style>
这是有效的,因为它会覆盖该样式标签下任何 TextBlock 的默认样式。然后,它使用 MultiDataTrigger 允许相对绑定返回到 Label,以检查其 IsMouseOver 属性是否为 True。恶心。
Edit:
请注意,这仅在您显式创建 TextBlock 时才有效。当我发布此内容时我错了,因为我已经弄脏了我的测试标签。嘘。谢谢安瓦卡指出这一点。
<Label Style="{StaticResource ActionLabelStyle}">
<TextBlock>Test!</TextBlock>
</Label>
这确实有效,但如果你非得遇到这个麻烦,那你就工作得太辛苦了。要么有人会发布一些更聪明的东西,要么正如你所说,我的选项 1 现在看起来相当不错。