如何避免在WPF文本框中以固定的高度和宽度剪切文本?

时间:2019-11-11 13:28:58

标签: c# asp.net wpf asp.net-core

如果文本大小大于框的宽度或高度,我正在尝试自动缩放字体大小。 我正在这样做

// textbox padding & margins excluded if (formattedText.WidthIncludingTrailingWhitespace > textbox.ActualWidth) { do { // reduce font size by step fontSize -= 1.0; // set fontsize ready for re-measure formattedText.SetFontSize(fontSize); } while ((formattedText.WidthIncludingTrailingWhitespace > textbox.ActualWidth) && (fontSize > minimumFontSize)); } myTextBox.FontSize = fontSize; return fontSize;

但是文本被剪切或裁剪。 请查看附件快照here 红色标记是文本框的边框。 谁能建议我该怎么办? 我也尝试过 if (formattedText.Width> textbox.ActualWidth) if (formattedText.Extent> textbox.ActualWidth)

谢谢

2 个答案:

答案 0 :(得分:0)

要使此行与多行TextBox一起使用,您需要做一些额外的事情。

  • 您需要在FormattedText上设置一个MaxTextWidth,以便它可以正确计算高度
  • 如果您的TextBox样式为Padding,请确保在您的WidthHeight计算中考虑到这一点

这是一个有效的示例:

private void AdjustText()
{
    var dpiInfo = VisualTreeHelper.GetDpi(MyTextBox);

    var fontSize = MyTextBox.FontSize;
    var minimumFontSize = 8;

    var typeface = new Typeface(MyTextBox.FontFamily,
        MyTextBox.FontStyle,
        MyTextBox.FontWeight,
        MyTextBox.FontStretch);

    var formattedText = new FormattedText(
        MyTextBox.Text,
        Thread.CurrentThread.CurrentCulture,
        MyTextBox.FlowDirection,
        typeface,
        fontSize,
        MyTextBox.Foreground,
        dpiInfo.PixelsPerDip);

    formattedText.MaxTextWidth = MyTextBox.Width - (MyTextBox.Padding.Left + MyTextBox.Padding.Right);

    if (formattedText.Height > MyTextBox.Height - (MyTextBox.Padding.Top + MyTextBox.Padding.Bottom))
    {
        do
        {
            // reduce font size by step
            fontSize -= 2.0;
            // set fontsize ready for re-measure
            formattedText.SetFontSize(fontSize);
        } while (formattedText.Height > MyTextBox.Height - (MyTextBox.Padding.Top + MyTextBox.Padding.Bottom) && fontSize > minimumFontSize);

        MyTextBox.FontSize = fontSize;
    }
}

答案 1 :(得分:-1)

您仅在检查宽度。但是在屏幕截图中,您似乎对文本框的高度有疑问。