Я хочу узнать базовый уровень шрифта в WinRT.
Я также рассчитал размер текста для определенного шрифта с помощью создание фиктивного TextBlock, но я не уверен, как рассчитать базовый уровень. Возможно ли это вообще в WinRT?
Я хочу узнать базовый уровень шрифта в WinRT.
Я также рассчитал размер текста для определенного шрифта с помощью создание фиктивного TextBlock, но я не уверен, как рассчитать базовый уровень. Возможно ли это вообще в WinRT?
К сожалению, вы ищете 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++
вот пара отправных точек для вас, если вы хотите попробовать:
эти ребята, похоже, действительно используют DirectWrite в приложении WinRT а>
это оболочка для C++, делающая доступным DX, DirectWrite во многом аналогичен
надеюсь, это поможет, удачи -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;
}
и я использовал это для этого:
идеально! правильно? надеюсь, это поможет -ck