在WPF中渲染上标

时间:2019-05-04 16:10:39

标签: c# wpf windows .net-4.7

这是代码:

static readonly char[] s_expChar = "eE".ToCharArray();

static void setValue( TextBlock target, double val )
{
    string text = val.ToString();
    int indE = text.IndexOfAny( s_expChar );
    if( indE > 0 )
    {
        string normal = text.Substring( 0, indE ) + "·10";

        string ss = text.Substring( indE + 1 );
        if( ss.StartsWith( "0" ) )
            ss = ss.Substring( 1 );
        else if( ss.StartsWith( "-0" ) )
            ss = "-" + ss.Substring( 2 );

        target.Inlines.Clear();
        target.Inlines.Add( new Run( normal ) );
        Run rSuper = new Run( ss );
        Typography.SetVariants( rSuper, FontVariants.Superscript );
        target.Inlines.Add( rSuper );
    }
    else
    {
        target.Text = text;
    }
}

以下是输出:

enter image description here

如您所见,-字符的垂直对齐方式已损坏,似乎不受FontVariants.Superscript的影响。如何解决?

在实时可视树的调试器中,我看到2个运行时的值正确,即第二个运行时的文本为-6,其中包含-

1 个答案:

答案 0 :(得分:1)

Typography.Variants应该与正确的字体和正确的字符一起使用。因此,例如,这段XAML不能正常工作:

<TextBlock FontSize="20">
    <TextBlock.Inlines>
        <Run Text="2e" />
        <Run Typography.Variants="Superscript" Text="-3" />
    </TextBlock.Inlines>
</TextBlock>

您注意到,“-”符号未按预期对齐。实际上,Typography.Variants仅适用于OpenType font(我建议您 Palatino Linotype Segoe UI )。此外,将负号与Superscript的印刷变形一起使用是不正确的:正确的字符称为superscript minus&#8315;是其十进制表示形式)。

因此正确的XAML将是:

<TextBlock FontSize="20" FontFamily="Segoe UI">
    <TextBlock.Inlines>
        <Run Text="2e" />
        <Run Typography.Variants="Superscript" Text="&#8315;3" />
    </TextBlock.Inlines>
</TextBlock>

,它将按预期显示。希望它能对您有所帮助。