6

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

注意:我说的是像素长度而不是 MAXLENGTH 的字符长度

所以基本上,如果文本框是 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()) ...

但我发现它非常老套,而且从来没有真正起作用。我正在努力寻找更可靠的东西。有任何想法吗?

4

5 回答 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");
}
于 2012-06-05T16:55:09.187 回答
4
if (textBox.ExtentWidth > textBox.ActualWidth)
{
    // your textbox is overflowed
}

适用于 .NET 4.5.2

于 2016-08-23T16:27:40.643 回答
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 端工作。

于 2015-09-03T17:32:33.740 回答
0

最好是使用隐藏的 TextBlock 并将其 MinWidth 和 Text 属性绑定到相应的 TextBox。将此 TextBlock 保持为隐藏状态。当文本超出边界时,隐藏文本块的宽度将增加,因为它设置了 MinWidth 而不是 Width。在它的 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 = "";
        }
于 2015-11-09T09:32:24.510 回答
-1

这应该这样做。

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

我是在 web 表单中完成的,但由于它全部在后端,我认为它应该与 winform 相同。

于 2012-06-05T16:19:25.917 回答