【发布时间】:2011-01-06 22:11:21
【问题描述】:
如何在 WPF 的 FormattedText 中将某些文本设置为下标/上标?
【问题讨论】:
标签: wpf wpf-controls subscript superscript formatted-text
如何在 WPF 的 FormattedText 中将某些文本设置为下标/上标?
【问题讨论】:
标签: wpf wpf-controls subscript superscript formatted-text
<TextBlock>
<Run>Normal Text</Run>
<Run Typography.Variants="Superscript">Superscript Text</Run>
<Run Typography.Variants="Subscript">Subscript Text</Run>
</TextBlock>
【讨论】:
你可以使用<TextBlock>5x<Run BaselineAlignment="Superscript">4</Run> + 4</TextBlock>之类的东西。
但是,据我所知,您必须自己减小字体大小。
【讨论】:
有趣的是,对于某些字符(m2、m3 等)不需要上标,但可以使用 unicode 字符。例如:
<Run Text=" m³" />
这将显示 m3。
【讨论】:
我使用了布局转换,因为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 设置中断的地方。
【讨论】:
我不知道您是否需要将其用于 FormattedText 特别,或者您的意思是 Inline 的派生,但以下内容适用于 Inlines,即使 Typography.Variants="Superscript" 失败上班。
TextRange selection = new TextRange(document.ContentStart, document.ContentEnd);
selection.ApplyPropertyValue(Inline.BaselineAlignmentProperty, BaselineAlignment.Superscript);
希望对你有帮助!
【讨论】:
Typography.Variants 仅适用于开放式字体。如果您不喜欢上标/下标超出实际文本的高度,则可以使用以下内容:
<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>
【讨论】:
这是唯一对我有用的东西。它还可以让您更好地控制对齐方式和字体大小。
<TextBlock Grid.Row="17">
3 x 3<Run FontSize="6pt" BaselineAlignment="TextTop">2</Run>)
</TextBlock>
【讨论】:
上标的设置适用于以下代码:
<TextBlock Text="(cm" />
<TextBlock ><Span BaselineAlignment="Top" FontSize="8">2</Span></TextBlock>
<TextBlock Text=")" />
在 Span 标签中为下标设置 Basealalignment 对我不起作用。 我尝试了以下代码,它运行良好。
<TextBlock Text="H" />
<TextBlock Text="2" Margin="-2,0,-2,0" TextBlock.LineHeight="3" >
<TextBlock Text="O" />
【讨论】: