Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Text wrapping in WPF hyperlink

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?

like image 919
svick Avatar asked Aug 12 '09 14:08

svick


3 Answers

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.

like image 156
dthrasher Avatar answered Oct 14 '22 05:10

dthrasher


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

Hope it helps.

like image 9
levanovd Avatar answered Oct 14 '22 05:10

levanovd


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

like image 2
Scott Whitlock Avatar answered Oct 14 '22 07:10

Scott Whitlock