Обтекание текстом в гиперссылке WPF

В моем приложении WPF у меня есть следующее:

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

Но если я устанавливаю HyperlinkText.Text на длинный текст, который обертывается, весь текст подчеркивается только один раз внизу (см. изображение). Есть ли способ, чтобы каждая строка подчеркивалась отдельно без ручной упаковки?

Ответ 1

Более простой способ добиться этого - использовать Запустить вместо TextBlock.

Надеюсь, что это поможет.

Ответ 2

Это действительно очень неприятная проблема в 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. Это просто не работает так, как вы ожидали.

Ответ 3

Попробуйте изменить стиль гиперссылки, чтобы удалить подчеркивание. Затем добавьте подчеркивание во внутренний стиль TextBlock.