Верхний индекс/индекс в гиперссылке в WPF

Я пытаюсь создать гиперссылку, содержащую текст с super- и/или подписками. Я нашел два способа сделать это, и оба они отстой.

Решение № 1: использовать типографику. Варианты. Это дает потрясающий верхний индекс... для некоторых шрифтов.

<StackPanel>
  <TextBlock FontFamily="Palatino Linotype" FontSize="30">
    <Hyperlink>R<Run Typography.Variants="Superscript">2</Run></Hyperlink>
    (Palatino Linotype)
  </TextBlock>
  <TextBlock FontFamily="Segoe UI" FontSize="30">
    <Hyperlink>R<Run Typography.Variants="Superscript">2</Run></Hyperlink>
    (Segoe UI)
  </TextBlock>
</StackPanel>


(источник: excastle.com)

Красиво смотрится в Палатино Линотипа; но для шрифтов, которые не поддерживают варианты, он просто игнорируется, эмуляция не выполняется, а текст полноразмерный, базовый, на 100% нормальный. Я предпочел бы позволить моим конечным пользователям выбирать шрифт, который они хотят использовать, и при этом работать с супер/подписчиками.

Решение № 2: используйте BaselineAlignment. Это повышает или уменьшает текст соответствующим образом, хотя в отличие от решения № 1, мне приходится уменьшать размер шрифта вручную. Тем не менее, это эффективно для всех шрифтов. Проблема заключается в подчеркивании гиперссылки.

<TextBlock FontSize="30" FontFamily="Palatino Linotype">
  <Hyperlink>
    R<Run BaselineAlignment="Superscript" FontSize="12pt">2</Run>
  </Hyperlink>
</TextBlock>

Подчеркивание поднимается и опускается вместе с текстом, который выглядит довольно убогим. Я предпочел бы иметь непрерывное, непрерывное подчеркивание под всей гиперссылкой. (И прежде чем кто-либо предложит Границу, я бы также хотел, чтобы Гиперссылка была способна переносить слова, подчеркнув все слова, включая первый ряд.)

Есть ли способ заставить верхний и нижний индексы работать в WPF любым шрифтом, не выглядя смешно плохо при подчеркивании?

Ответы

Ответ 1

Если гиперссылка не будет переноситься более чем на одну строку, то встраивание другого TextBlock может работать:

<TextBlock FontSize="30" FontFamily="Palatino Linotype">
  <Hyperlink>
    <TextBlock>
      R<Run BaselineAlignment="Superscript" FontSize="12pt">2</Run>
    </TextBlock>
  </Hyperlink>
</TextBlock>

Это даст твердую гиперссылку под дочерней гиперссылкой, что означает непрерывную гиперссылку:

Однако если встроенный TextBlock нужно переносить на несколько строк, вы получите только одно подчеркивание под всем перенесенным абзацем, а не подчеркивание каждой строки текста:


(источник: excastle.com)

Если вы можете поместить TextBlock только вокруг небольшого фрагмента содержимого, для которого нужны верхние индексы (например, только R ^ 2 в приведенном выше примере), и оставить остальную часть текста, привязанную к гиперссылке, то вы получите подчеркивание как обычно, Но иногда это не практично, поэтому стоит на это обратить внимание.

Ответ 2

Вы можете использовать символы юникода надстрочного индекса (например, http://www.fileformat.info/info/unicode/char/b2/index.htm)

Вот так:

<TextBlock FontSize="30" FontFamily="Segoe UI">
  <Hyperlink>
      Apply R² Calculation
  </Hyperlink>
</TextBlock>

Результат:

Result image

Очевидно, что это не сработает, если у вас нет супер-скриптов, на самом деле есть символ надстрочного символа юникода.