Перенос текста в гиперссылке WPF

#wpf #xaml #hyperlink #word-wrap

#wpf #xaml #гиперссылка #перенос слов

Вопрос:

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

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

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

Ответ №1:

Это действительно, действительно раздражающая проблема в 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’ уже имеет дочерний элемент и не может быть добавлен «. ‘Run’ может принимать только одного дочернего элемента.

Итак, как отметил @Scott Whitlock, вы должны использовать a 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>
  

Вздох. Я действительно ненавижу Hyperlink элемент WPF. Это просто работает совсем не так, как вы ожидаете.

Комментарии:

1. Хороший ответ! Хорошо резюмировано!

Ответ №2:

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

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

Комментарии:

1. Спасибо, это тоже работает и намного проще. (Мне пришлось переместить TextWrapping=»Wrap» из внутреннего текстового блока во внешний.)

2. Почему эта ссылка приводит меня к проверке безопасности?

Ответ №3:

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

Комментарии:

1. Хотите опубликовать какой-нибудь код? Я хотел бы попробовать это, но не уверен, как убрать подчеркивание, не нарушая остальной стиль. И я ленивый 🙂

2. @skypecakes: ответ levanovd лучше. Смотрите это для получения дополнительной информации: longhorncorner.com/UploadFile/raj1979/TextWPF01062009041311AM /…

3. Спасибо, Скотт. Это выглядело многообещающе, но, к сожалению, у меня не сработает, потому что я заполняю текст привязкой к данным и на .Net 3.5. Вы не можете выполнить привязку. Текст в версии 3.5. Сегодня я менее ленив, поэтому посмотрю, что я могу придумать, и опубликую результаты в качестве ответа на вопрос OP, если это достаточно хорошо.

4. @skypecakes: Существует множество примеров вложенных свойств, которые вы можете использовать для привязки несвязываемых свойств непосредственно в xaml.