WPF格式化文本: 计算字体大小以填充可用高度空间

3
这是我的FormattedText,它是画布的子元素:
             this.formattedText = new FormattedText(
                                "This is a text to test",
                                CultureInfo.CurrentUICulture,
                                this.FlowDirection,
                                new Typeface(this.FontFamily, this.FontStyle, this.FontWeight, FontStretches.Normal),
                                this.FontSize,
                                Fill);

请查看此图片:

enter image description here

第三种形式是我想要的,但我不知道如何计算字体大小以适应高度(而不是宽度),因为不同的字体具有不同的高度和不同的 FontFamily.LineSpacing。
注意:我不想使用 ViewBox,因为我想将文本作为爬行文本和跑马灯进行动画处理。
更新:
某些字体需要比控件的高度更大的 FontSize,这取决于 FontFamily.LineSpacing。我可以通过设置 LineHeight 来删除上部空间,但是我无法根据 FontFamily.LineSpacing 计算新的 FontSize。
请帮帮我。

嗯..你尝试过将formattedText的字体大小设置为this.height吗? this.formattedText = new FormattedText( "这是一个用来测试的文本", CultureInfo.CurrentUICulture, this.FlowDirection, new Typeface(this.FontFamily, this.FontStyle, this.FontWeight, FontStretches.Normal), this.Height, Fill); - Pikoh
是的,我也将FontSize设置为父元素的高度。但问题是下方有空白。(某些字体需要比控件高度更大的尺寸,这取决于FontFamily.LineSpacing。我可以通过设置LineHeight来去除上方的空白,但无法计算新的FontSize以去除下方的空白。 - Maria
2个回答

3
你可以使用循环来获取最大字体大小(步长为1):
int MaxFontSize = 0;
FormattedText Ft = ... //Your formatted text
while(true)
{
  Ft.SetFontSize(MaxFontSize);
  if (Ft.Height > MaxHeigthOfControl)
  {
    //Too large! Maxmimum size found one step before
    MaxFontSize--;
    break;
  }
  else
  {
    MaxFontSize++;
  }
}
//MaxFontSize is the maximum possible FontSize

如果这种增量方式太慢...尝试使用类似图中所示的近似方法: enter image description here

谢谢您的回复,我已经设置了最大可能的 FontSize,但问题是有上下空间。 我可以通过设置 LineHeight 来去除上部空间,但我无法去除下部空间。 - Maria

1

好的,你需要了解格式化文本控件比你想象的更加复杂。

有一个LineHeightBaseLineTextAlignment属性会影响你感兴趣的布局区域。尝试改变这些属性以获得所需的效果。


谢谢您的回复,但是我使用了 LineHeight 属性来移除上方空白(如图所示),BaseLine 属性是只读的,并且 TextAlignment 属性不起作用。 - Maria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接