Ответ 1
Более простой способ добиться этого - использовать Запустить вместо TextBlock.
Надеюсь, что это поможет.
В моем приложении WPF у меня есть следующее:
<StackPanel>
<TextBlock>
<Hyperlink>
<TextBlock TextWrapping="Wrap" Name="HyperlinkText" />
</Hyperlink>
</TextBlock>
</StackPanel>
Но если я устанавливаю HyperlinkText.Text
на длинный текст, который обертывается, весь текст подчеркивается только один раз внизу (см. изображение). Есть ли способ, чтобы каждая строка подчеркивалась отдельно без ручной упаковки?
Более простой способ добиться этого - использовать Запустить вместо TextBlock.
Надеюсь, что это поможет.
Это действительно очень неприятная проблема в 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
как внутренний элемент и вместо этого использовать атрибуты TextDecoration
Hyperlink
и 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
. Это просто не работает так, как вы ожидали.
Попробуйте изменить стиль гиперссылки, чтобы удалить подчеркивание. Затем добавьте подчеркивание во внутренний стиль TextBlock.