为一组文本块或内联添加下划线

时间:2012-10-29 23:31:33

标签: c# wpf

简短版本:我想在DependencyObject中加入任何可强制下划线的内容,例如在这种情况下,我可以设置字体大小和颜色,但我不能将其设置为带下划线:

<StackPanel TextElement.FontWeight="Bold" TextElement.Foreground="Red" Inline.TextDecorations="Underline">
    <TextBlock Text="This ">
    </TextBlock>
    <TextBlock><Run Text="is "></Run><Run Text="a test"></Run></TextBlock>
</StackPanel>

那么如何在一个位置指定我希望所有文本都加下划线?

Long Version:我正在创建一个类似于ContentPresenter的超链接控件。程序员使用我的超链接控件可以将内容放入控件并指定DataTemplate来显示其内容。在MouseOver上我想要一个触发器将字体设置为红色并为文本加下划线。我可以很容易地将颜色变为红色,但下划线被证明是一个问题。

<Trigger Property="IsMouseOver" Value="True">
    <Setter Property="Inline.TextDecorations" Value="Underline"></Setter>
    <Setter Property="TextElement.Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:ContentHyperlink}}, Path=ActiveColor}"></Setter>
</Trigger>

1 个答案:

答案 0 :(得分:0)

查看评论中发布的链接,看起来似乎没有一个很好的xaml方式来做到这一点。我目前正在使用C#代码,它运行良好。为了社区的利益,这是我的解决方案。欢迎任何关于如何更好地做到这一点的评论。我只是捕获MouseLeave和MouseEnter事件并在那里显示下划线。

    void Control_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
        WPFHelper.EnumerateChildren<TextBlock>(this, true).ForEach(c => c.TextDecorations = null);
    }

    void Control_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        WPFHelper.EnumerateChildren<TextBlock>(this, true).ForEach(c => c.TextDecorations = TextDecorations.Underline);
    }

WPFHelper类只是枚举DependencyObject的所有子节点,而ForEach是一个扩展方法,它只为每个项目执行lambda表达式中的操作。