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

时间:2012-06-05 16:13:01

标签: c# wpf

有没有办法知道我的文本在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()) ...

但我发现它非常黑客而且从未真正起作用。我正在努力寻找更可靠的东西。有什么想法吗?

5 个答案:

答案 0 :(得分:6)

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

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");
}

答案 1 :(得分:3)

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

适用于.NET 4.5.2

答案 2 :(得分:1)

如果您没有针对.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端工作。

答案 3 :(得分:0)

最好是使用隐藏的TextBlock并将其MinWidth和Text属性绑定到相应的TextBox。将此TextBlock保持为隐藏状态。当Text超过边界时,隐藏文本块的宽度将增加,因为它设置了MinWidth而不是Width。在它的SizeChanged事件中,我们检查并比较TextBlock和TextBox的ActualWidth。如果TextBlock的ActualWidth大于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 = "";
        }

答案 4 :(得分:-1)

这应该这样做。

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

我是在网络表单中做到这一点,但由于它全部在后端,我认为对于winform来说它应该是相同的。