WPF 超链接中的文本换行

发布于 2024-08-01 20:33:31 字数 418 浏览 5 评论 0原文

在我的 WPF 应用程序中,我有这样的情况:

<StackPanel>
  <TextBlock>
     <Hyperlink>
       <TextBlock TextWrapping="Wrap" Name="HyperlinkText" />
     </Hyperlink>
  </TextBlock>
</StackPanel>

但是,如果我将 HyperlinkText.Text 设置为换行的长文本,则整个文本仅在底部加下划线一次(参见图片)。 有没有办法让每行单独加下划线而不需要手动换行?

In my WPF application I have this:

<StackPanel>
  <TextBlock>
     <Hyperlink>
       <TextBlock TextWrapping="Wrap" Name="HyperlinkText" />
     </Hyperlink>
  </TextBlock>
</StackPanel>

But if I set HyperlinkText.Text to a long text that wraps, the whole text is underlined only once at the bottom (see image). Is there a way to have every line underlined separately without manual wrapping?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

何必那么矫情 2024-08-08 20:33:31

这是 WPF 中一个非常非常烦人的问题。 我什至称其为错误。

正如 @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”已经有一个子对象,无法添加“”。 “奔跑”只能接受一个孩子。

因此,正如 @Scott Whitlock 所指出的,您必须使用 TextBlock 作为内部元素,并使用 HyperlinkTextDecoration 属性和TextBlock 相反:

    <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 元素。 它只是没有像你期望的那样工作。

This is a really, really annoying problem in WPF. I'd go so far as to call it a bug.

As @levanovd mentioned in his answer, you can get a hyperlink to wrap properly by using a Run as the inner element:

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

This works great, until you want to apply text formatting within the hyperlink. If you tried to do this, for example:

    <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>

You'd get a compile error:

The object 'Run' already has a child and cannot add ''. 'Run' can accept only one child.

So, as @Scott Whitlock noted, you have to use a TextBlock as the inner element and mess around with the TextDecoration attributes of the Hyperlink and TextBlock instead:

    <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>

Sigh. I really hate WPF's Hyperlink element. It just doesn't work anything like you'd expect.

不交电费瞎发啥光 2024-08-08 20:33:31

实现此目的的一种更简单的方法是使用 Run 而不是 TextBlock。

希望能帮助到你。

An easier way to achieve that is to use Run instead of TextBlock.

Hope it helps.

魂归处 2024-08-08 20:33:31

尝试更改超链接的样式以删除下划线。 然后向内部 TextBlock 样式本身添加下划线。

Try changing the style of the Hyperlink to remove the underline. Then add an underline to the inner TextBlock style itself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文