Text wrapping in WPF hyperlink

2019-04-05 03:20发布

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?

3条回答
Lonely孤独者°
2楼-- · 2019-04-05 03:38

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.

查看更多
甜甜的少女心
3楼-- · 2019-04-05 03:50

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

查看更多
成全新的幸福
4楼-- · 2019-04-05 04:01

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

Hope it helps.

查看更多
登录 后发表回答