Сделать верхний индекс в WPF - PullRequest
1 голос
/ 04 мая 2019

Вот код:

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 Ответ

1 голос
/ 04 мая 2019

Typography.Variants следует использовать с правильными шрифтами и правильными символами.Так, например, этот фрагмент XAML может работать неправильно:

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

Как вы заметили, символ "-" не выровнен, как предполагалось.Действительно, Typography.Variants работает только для шрифта OpenType (я предлагаю вам Palatino Linotype или Segoe UI ).Более того, неправильно использовать символ минус с типографским вариантом Superscript: правильный символ называется верхний индекс минус (&#8315; - его десятичное представление).

Таким образом, правильный XAMLбудет:

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

и будет отображаться как положено.Я надеюсь, что это может помочь вам.

...