Вычисление базовой линии шрифта в WinRT

Я хочу узнать базовый уровень шрифта в WinRT.

Я также рассчитал размер текста для определенного шрифта с помощью создание фиктивного TextBlock, но я не уверен, как рассчитать базовый уровень. Возможно ли это вообще в WinRT?


person Tom Lokhorst    schedule 07.04.2013    source источник


Ответы (1)


К сожалению, вы ищете FormattedText [MSDN: 1 2 ], который существует в WPF и не существует в WinRT (я даже не думаю, что он есть даже в Silverlight).

Вероятно, она будет включена в будущую версию, потому что это очень востребованная функция, которой очень не хватает, и команда знает об этом упущении. См. здесь: http://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/380b4b7b-72e2-4435-b7f7-0d2afca4eac0/#db8a49dc-b252-4ffb-a128-02ed14ded2af.

Если вы заинтересованы или действительно нуждаетесь в способе измерения специфики начертания шрифта, вы можете попробовать написать оболочку для DirectWrite, которая, насколько мне известно, находится внутри стека доступных технологий WinRT, однако он доступен только через C++

вот пара отправных точек для вас, если вы хотите попробовать:

надеюсь, это поможет, удачи -ck

обновить

Я немного подумал об этом и вспомнил, что у TextBlock есть часто забываемое свойство BaselineOffset, которое дает вам базовую линию от верхней части поля для выбранного начертания шрифта! Таким образом, вы можете использовать тот же хак, который все используют, чтобы заменить MeasureString, чтобы заменить потерю FormattedText. Вот соус:

    private double GetBaselineOffset(double size, FontFamily family = null, FontWeight? weight = null, FontStyle? style = null, FontStretch? stretch = null)
    {
        var temp = new TextBlock();
        temp.FontSize = size;
        temp.FontFamily = family ?? temp.FontFamily;
        temp.FontStretch = stretch ?? temp.FontStretch;
        temp.FontStyle = style ?? temp.FontStyle;
        temp.FontWeight = weight ?? temp.FontWeight;

        var _size = new Size(10000, 10000);
        var location = new Point(0, 0);

        temp.Measure(_size);
        temp.Arrange(new Rect(location, _size));

        return temp.BaselineOffset;
    }

и я использовал это для этого: screenshot

идеально! правильно? надеюсь, это поможет -ck

person ckozl    schedule 11.04.2013
comment
Вау, да это идеально! Я видел это свойство при поиске этой проблемы, но по какой-то причине отклонил его... Но оно работает совершенно правильно. - person Tom Lokhorst; 12.04.2013