【问题标题】:How to avoid clipping text in WPF textbox with fixed height and width?如何避免在具有固定高度和宽度的 WPF 文本框中剪切文本?
【发布时间】:2019-11-25 19:18:04
【问题描述】:

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

// 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)

谢谢

【问题讨论】:

  • 尝试将 TextBox(或 TextBlock?)放入 Viewbox。
  • 感谢您的回复是否可以通过编程方式将其放入视图框中?
  • 当然,请看这里:docs.microsoft.com/en-us/dotnet/api/…
  • 这是为了更新 stackoverflow 社区,以下@Keithernet 提供的解决方案适用于大多数情况,但当文本为粗体时问题会重现。请查看 ScreenShot here Screenshot 字体大小为 9,但最小字体大小限制为 06。

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


【解决方案1】:

要使用多行文本框,您需要做一些额外的事情。

  • 您需要在 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;
    }
}

【讨论】:

  • 很遗憾,我不使用 .NET Core 2.2,所以我不知道。
  • 我能够成功运行它并且它也有效。但是当我将 reductionStep fontSize -= 2.0; 更改为 fontSize -= 0.2; 时,同样的问题会重复。因此,对于文本的动态长度和大小,它也可以用fontSize -= 2.0; 重现,这可能吗?谢谢
  • WPF 一直存在关于字体大小和缩放的内部数学问题。我不确定 FormattedText 在内部是如何工作的,所以很难说。
  • 嗨 Keithernet,只是想问一下,您能提出任何动态减小字体大小而不是硬编码值(即 0.2 或 2.0)的好方法吗?
  • 感谢您的支持,在这里回复已经很晚了,但对于犯同样错误的其他人可能会发现它有帮助。我能够修复这个传递的“Verdana”是 formattedText 对象中的后备字体系列,这导致修复了这批文本问题:) 所以是字体在计算 formattedText 的确切高度和宽度时遇到了麻烦
猜你喜欢
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 2023-03-03
  • 2010-12-16
  • 2014-03-19
  • 1970-01-01
相关资源
最近更新 更多