4

我想找出WinRT中字体的基线。

我还通过创建一个虚拟 TextBlock计算了特定字体的文本大小,但我不确定如何计算基线。这在 WinRT 中是否可行?

4

1 回答 1

2

不幸的是,您正在寻找的是FormattedText[MSDN: 1 2 ],它存在于 WPF 中并且不存在于 WinRT 中(我什至认为它甚至还没有出现在 Silverlight 中)。

它可能会包含在未来的版本中,因为它似乎是一个非常受欢迎的功能,非常想念并且团队意识到它的遗漏。请参阅此处:http ://social.msdn.microsoft.com 。

如果您有兴趣或真的非常需要一种方法来测量字体的细节,您可以尝试为DirectWrite编写一个包装器,据我所知,它位于 WinRT 可用的技术堆栈中,但它只能通过 C++ 访问

如果您想尝试,这里有几个出发点:

希望这会有所帮助,祝你好运-ck

更新

我想了一会儿,并记得TextBlocks 有一个经常被遗忘的属性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;
    }

我用它来做到这一点: 截屏

完美的!对?希望这会有所帮助-ck

于 2013-04-11T16:12:44.613 回答