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

6
有没有办法知道我的WPF文本框中的文本是否超过了其长度?
注意:我说的是像素长度,而不是最大长度的字符长度。
基本上,如果文本框长度为50个像素。而我在里面输入的文本是:“Supercalifragilisticexpialidocious!虽然它的声音有点丑陋”。
那么它就无法适应?我想知道它不适合里面。
但如果文本框宽度为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()) ...

但我认为这样做太过粗糙,而且并不是很可靠。我正在尝试寻找更加可靠的方法。你有什么建议吗?


你不能读取文本框的最大长度,然后将其与字符串的长度进行比较吗? - Limey
我不希望文本框有限制(因此没有最大尺寸)。 - Shai UI
我认为你需要检查textBox.ActualWidth。 - paparazzo
5个回答

7
你可以继承文本框,然后创建一个自定义方法来返回你想要的值:
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");
}

因为字体和实际宽度的原因,它的效果比我的好。谢谢! - Shai UI

4
if (textBox.ExtentWidth > textBox.ActualWidth)
{
    // your textbox is overflowed
}

适用于.NET 4.5.2


这是错误的,也没有回答问题。无论如何,文本尺寸都不会被考虑与文本框尺寸进行比较。 - sergiol

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 Forms应用程序中完成的,而不是WPF应用程序,因此我不能保证它在WPF方面能够正常工作。


0
最好使用一个隐藏的TextBlock,并将其MinWidth和Text属性绑定到相应的TextBox上。将此TextBlock保持隐藏状态。当文本超出边界时,由于它的MinWidth被设置而不是Width,因此隐藏的textblock的宽度将增加。在它的SizeChanged事件中,我们检查并比较TextBlock和TextBox的ActualWidth。如果TextBlock的ActualWidth大于TextBox的ActualWidth,则意味着文本很大。
我已经尝试了多种字体大小,并且效果良好。
<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 = "";
        }

-1

这应该可以做到。

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

我在一个Web表单中完成了这个操作,但由于它全部在后端处理,我认为在Winform中应该也是一样的。


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