Верхний индекс/индекс в гиперссылке в 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]()
Очевидно, что это не сработает, если у вас нет супер-скриптов, на самом деле есть символ надстрочного символа юникода.