Установить верхний индекс и нижний индекс в форматированном тексте в wpf - PullRequest
36 голосов
/ 19 января 2010

Как я могу установить некоторый текст как индекс / верхний индекс в FormattedText в WPF?

Ответы [ 8 ]

44 голосов
/ 19 января 2010

Вы используете Типография. Варианты :

<TextBlock>
    <Run>Normal Text</Run>
    <Run Typography.Variants="Superscript">Superscript Text</Run>
    <Run Typography.Variants="Subscript">Subscript Text</Run>
</TextBlock>
12 голосов
/ 19 января 2010

Вы можете использовать что-то вроде <TextBlock>5x<Run BaselineAlignment="Superscript">4</Run> + 4</TextBlock>.

Однако, насколько мне известно, вам придется самостоятельно уменьшить размер шрифта.

10 голосов
/ 07 августа 2014

Я использовал преобразование макета, потому что Typography.Variants часто не работает:

<TextBlock Text="MyAmazingProduct"/>
 <TextBlock Text="TM">
  <TextBlock.LayoutTransform>
   <!-- Typography.Variants="Superscript" didn't work -->
   <TransformGroup>
    <ScaleTransform ScaleX=".75" ScaleY=".75"/>
    <TranslateTransform Y="-5"/>
   </TransformGroup>
  </TextBlock.LayoutTransform>
 </TextBlock>
<TextBlock Text="{Binding Path=Version, StringFormat={} v{0}}"/>

Преимущество использования LayoutTransform заключается в том, что он нечувствителен к размеру шрифта. Если размер шрифта впоследствии изменяется, этот верхний индекс работает там, где явно нарушается настройка FontSize.

9 голосов
/ 19 декабря 2016

Интересно отметить, что для некоторых символов (m 2 , m 3 и т. Д.) Верхний индекс не требуется, но можно использовать символ Юникода. Например:

<Run Text=" m&#x00B3;" />

Это покажет m 3 .

3 голосов
/ 01 ноября 2010

Типография. Варианты работают только для шрифтов открытого типа . Если вам не нравится, когда ваши верхние индексы / индексы выходят за пределы фактического текста, вы можете использовать что-то вроде следующего:

<StackPanel Orientation="Horizontal">
    <TextBlock FontSize="10" Margin="0,5,0,0">1</TextBlock>
    <TextBlock FontSize="30">H</TextBlock>
    <TextBlock FontSize="10" Margin="0,20,0,0">2</TextBlock>
</StackPanel>
3 голосов
/ 04 октября 2010

Не знаю, нужно ли вам это для работы с FormattedText , в частности, , или вы имеете в виду деривации Inline, но следующее будет работать для Inlines, даже если Typography.Variants = "Superscript" не удаетсяработа.

TextRange selection = new TextRange(document.ContentStart, document.ContentEnd);
selection.ApplyPropertyValue(Inline.BaselineAlignmentProperty, BaselineAlignment.Superscript);

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

1 голос
/ 13 марта 2015

Это единственное, что сработало для меня. Это также дает вам больше контроля над выравниванием и размером шрифта.

<TextBlock Grid.Row="17">
    3 x 3<Run FontSize="6pt" BaselineAlignment="TextTop">2</Run>)
</TextBlock>
1 голос
/ 16 июля 2013

Настройка верхнего индекса работает нормально со следующим кодом:

<TextBlock Text="(cm"  />
<TextBlock ><Span BaselineAlignment="Top" FontSize="8">2</Span></TextBlock>
<TextBlock Text=")" />

Установка Baseallignment для индекса в теге Span не работает для меня. Я попробовал следующий код, и он работал нормально.

  <TextBlock Text="H"  />
  <TextBlock Text="2" Margin="-2,0,-2,0" TextBlock.LineHeight="3" >   
  <TextBlock Text="O" />
...