如何知道文本是否大于文本框

本文关键字:文本 大于 是否 何知道 | 更新日期: 2023-09-27 18:36:27

有没有办法知道我在 wpf 文本框中的文本是否超过了它的长度?

注意:我说的是像素长度,而不是最大长度的字符长度

所以基本上,如果文本框的长度为 50 像素。我里面有一段文字是:"超强的虚幻!即使它的声音很离谱"

那它就不适合那里吧?我想知道它不适合它。但是,如果文本框的宽度为 900 像素。它只是可能。

我目前正在检查以下内容。

private double GetWidthOfText()
{
    FormattedText formattedText = new FormattedText(MyTextbox.Text,
        System.Globalization.CultureInfo.GetCultureInfo("en-us"),
        FlowDirection.LeftToRight, new Typeface(new FontFamily("Arial"), FontStyles.Normal, FontWeights.Bold, FontStretches.Normal), MyTextbox.FontSize, Brushes.Black);
    return formattedText.Width;
}

if (textBox.Width < GetWidthOfText()) ...

但我发现它非常笨拙,从来没有真正起作用。我试图找到更可靠的东西。有什么想法吗?

如何知道文本是否大于文本框

可以从文本框继承,然后创建自定义方法来返回所需的值:

public class MyTextBox :TextBox 
{
    public bool ContentsBiggerThanTextBox()
    {
        Typeface typeface = new Typeface(this.FontFamily, this.FontStyle, this.FontWeight, this.FontStretch);
        FormattedText ft = new FormattedText(this.Text, System.Globalization.CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, this.FontSize, Brushes.Black);
        if (ft.Width > this.ActualWidth)
            return true;
        return false;
    }
}

将 XAML 中的文本框声明为 MyTextBox 而不是 TextBox,然后只需执行以下操作:

private void button1_Click(object sender, RoutedEventArgs e)
{
    if (tb.ContentsBiggerThanTextBox())
        MessageBox.Show("The contents are bigger than the box");
}
if (textBox.ExtentWidth > textBox.ActualWidth)
{
    // your textbox is overflowed
}

适用于 .NET 4.5.2

如果您不针对 .NET 4.5 或更高版本的框架,John Koemer 的答案将不起作用。

如果您像我一样面向 .NET 4.0 框架,请使用此方法:

    private bool IsContentsBiggerThanTextBox(TextBox textBox)
    {
        Size size = TextRenderer.MeasureText(textBox.Text, textBox.Font);
        return ((size.Width > textBox.Width) || (size.Height > textBox.Height));
    }

这也适用于多行文本框。因此,如果您的行数多于文本框可以显示的行数,则此方法也有效。

请注意,这实际上是在 Windows 窗体应用程序中完成的,而不是在 WPF 应用程序中完成的,因此我不保证它会在 WPF 端工作。

最好是使用隐藏的 TextBlock 并将其 MinWidth 和 Text 属性绑定到相应的文本框。将此文本块保持为隐藏状态。当文本超过边界时,隐藏文本块的宽度将增加,因为它设置了最小宽度而不是宽度。在它的SizeChanged事件中,我们检查并比较TextBlock和TextBox的实际宽度。如果 TextBlock 的实际宽度大于 TextBox 的宽度,则表示文本很大。

我已经用多种字体大小检查了这种方法并且效果很好。

<TextBox x:Name="textBox" Width="120" AcceptsReturn="False" TextWrapping="NoWrap" />
<TextBlock x:Name="tblk" TextWrapping="NoWrap" Text="{Binding Text, ElementName=textBox}" MinWidth="{Binding Width, ElementName=textBox}" Visibility="Hidden" SizeChanged="TextBlock_SizeChanged" />

代码隐藏:

private void TextBlock_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            //if (e.NewSize.Width > tblk.MinWidth)
            if(tblk.ActualWidth > textBox.ActualWidth)
                tbStatus.Text = "passed";
            else
                tbStatus.Text = "";
        }

这应该可以做到。

        int tblength = txtMytextbox.MaxLength;
        string myString = "My text";
        if (myString.Length > tblength)

我在 Web 表单中执行此操作,但由于它都在后端,因此我认为对于 winform 来说应该是相同的。