WPF中的文本换行超链接

16
在我的WPF应用程序中,我有以下内容:
<StackPanel>
  <TextBlock>
     <Hyperlink>
       <TextBlock TextWrapping="Wrap" Name="HyperlinkText" />
     </Hyperlink>
  </TextBlock>
</StackPanel>

但是如果我将HyperlinkText.Text设置为换行的长文本,整个文本只会在底部下划线一次(参见图像)。有没有办法在没有手动换行的情况下分别对每一行进行下划线?

3个回答

17

这是WPF中一个非常令人烦恼的问题。我甚至可以称之为一个bug。

正如@levanovd在他的回答中提到的,您可以通过在内部元素使用 Run 来使超链接正确包装:

    <StackPanel>
        <TextBlock TextWrapping="Wrap">
            <Hyperlink><Run>This is a really long hyperlink. Yeah, a really really long hyperlink, whaddaya think?</Run></Hyperlink>
        </TextBlock>
    </StackPanel>

这很好用,直到你想在超链接中应用文本格式化标记。如果你尝试这样做,例如:

    <StackPanel>
        <TextBlock TextWrapping="Wrap">
            <Hyperlink><Run>This is a really long <Run TextWeight="Bold">hyperlink</Run>. Yeah, a really really long hyperlink, whaddaya think?</Run></Hyperlink>
        </TextBlock>
    </StackPanel>

你会得到一个编译错误:

对象“Run”已经有一个子元素,不能添加“”。'Run' 只能接受一个子元素。

所以,正如 @Scott Whitlock 提到的,你必须使用 TextBlock 作为内部元素,并且在 HyperlinkTextBlockTextDecoration 属性上进行调整:

    <StackPanel>
        <TextBlock>
            <Hyperlink TextDecorations="None"><TextBlock TextWrapping="Wrap" TextDecorations="Underline">This is a really long <Run FontWeight="Bold">hyperlink</Run>. Yeah, a really really long hyperlink, whaddaya think?</TextBlock></Hyperlink>
        </TextBlock>
    </StackPanel>

唉,我真的很讨厌 WPF 的 Hyperlink 元素。它根本不像你期望的那样工作。


1
很好的回答!总结得很好! - Vincent

9
更简单的方法是使用Run而不是TextBlock。
希望对您有所帮助。

谢谢,这也可以,并且更简单。(我不得不将TextWrapping="Wrap"从内部TextBlock移动到外部。) - svick
为什么这个链接带我去了安全检查? - Rachel Martin

2

尝试更改超链接的样式以去除下划线。然后将下划线添加到内部TextBlock样式中。


能否贴一些代码?我想尝试一下,但不确定如何在不破坏其余样式的情况下去掉下划线。而且我很懒 :-) - stone
@skypecakes:levanovd的回答更好。请参考此链接获取更多信息:http://www.longhorncorner.com/UploadFile/raj1979/TextWPF01062009041311AM/TextWPF.aspx - Scott Whitlock
谢谢,Scott。看起来很有前途,但不幸的是对我不起作用,因为我正在使用数据绑定填充文本,并且在 .Net 3.5 上无法绑定 Run.Text。今天我不那么懒了,所以我会想出一些解决方案,并将结果发布为 OP 的问题的答案,如果足够好的话。 - stone
@skypecakes:有很多附加属性的例子可以用来在XAML中直接绑定不可绑定的属性。 - Scott Whitlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接