TextBlock与大写字母一样大(忽略字体ascender / descender)

我希望在TextBlock上获得特定的行为,使其高度仅包括大写字母的高度(从基线到顶部减去“上boost度”)。 请从维基百科看图像Sphinx ,看看我的意思。 此外,下面的图片可能更好地表明我所追求的。

样品在此处输入图像描述

我不是专门寻找纯XAML解决方案(可能是不可能的)所以后面的C#代码(转换器)也没问题。

这是XamlPad中用于在上图中生成左A的XAML。

  

你可以尝试在LineHeight属性上使用属性LineStackingStrategy =“BlockLineHeight”和转换器,在TextBlock的高度上使用转换器。 这是转换器的示例代码

 // Height Converter public class FontSizeToHeightConverter : IValueConverter { public static double COEFF = 0.715; public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return (double)value * COEFF; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } // LineHeightConverter public class FontSizeToLineHeightConverter : IValueConverter { public static double COEFF = 0.875; public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return double.Parse(value.ToString()) * COEFF; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } 

转换器上使用的系数取决于使用的族字体(基线和行间距):

  

样品的参数Coeff = 0.7

最好的解决方案是找到如何根据FontFamily的参数Baseline和LineSpacing计算Coeff。 在此示例(Segeo UI)中,Coeff of Height = 0.715并且LineHeight = 0,875 * FontSize。

更新:

如果我理解正确,我知道有一些技巧,

您可以使用RenderTransform进行Scale ,这通常是最有效的方法;

      

或者,您可以将TextBlock嵌入到Viewbox以“缩放”文本以适合其容器的边界,例如,如果您在网格行上设置硬高度值,则;

              

或者你可以将FontSize绑定到Container元素,如;

    

他们可能会呈现你想要的效果吗?