web-dev-qa-db-fra.com

Définir les indices et exposants dans le texte mis en forme dans wpf

Comment puis-je définir du texte comme indice/exposant dans FormattedText dans wpf

36
Firoz

Vous utilisez Typography.Variants :

<TextBlock>
    <Run>Normal Text</Run>
    <Run Typography.Variants="Superscript">Superscript Text</Run>
    <Run Typography.Variants="Subscript">Subscript Text</Run>
</TextBlock>
43
Reed Copsey

Vous pouvez utiliser quelque chose comme <TextBlock>5x<Run BaselineAlignment="Superscript">4</Run> + 4</TextBlock>.

Cependant, à ma connaissance, vous devrez réduire vous-même la taille de la police.

12
Matthias

J'ai utilisé une transformation de présentation, car Typography.Variants ne fonctionne souvent pas:

<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}}"/>

L'avantage d'utiliser LayoutTransform est qu'il est insensible à la taille de la police. Si la taille de la police est modifiée ultérieurement, cet exposant fonctionne là où le paramètre FontSize explicite est interrompu.

10
Ramon de Klein

Il est intéressant de noter que pour certains personnages (m2, m3, etc) un exposant n'est pas nécessaire, mais le caractère unicode peut être utilisé. Par exemple:

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

Cela montrerait m3.

9
Freek Sanders

Typography.Variants ne fonctionne que pour les polices de type ouvert . Si vous n'aimez pas vos exposants/indices qui dépassent la hauteur du texte réel, vous pouvez utiliser quelque chose comme ce qui suit:

<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
Nitin Chaudhari

Je ne sais pas si vous avez besoin que cela fonctionne avec FormattedText plus précisément , ou si vous entendez des dérivations d'Inline, mais les suivantes fonctionneront sur Inlines, même si Typography.Variants = "Superscript" ne fonctionne pas.

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

J'espère que ça aide!

3
T. Webster

Le réglage en exposant fonctionne bien avec le code suivant:

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

La définition de Baseallignment pour un indice dans la balise Span ne fonctionnait pas pour moi. J'ai essayé le code suivant et tout a bien fonctionné.

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

C'est la seule chose qui a fonctionné pour moi. Cela vous donne également plus de contrôle sur l'alignement et la taille de la police.

<TextBlock Grid.Row="17">
    3 x 3<Run FontSize="6pt" BaselineAlignment="TextTop">2</Run>)
</TextBlock>
0
MoMo