有没有办法知道我的文本在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()) ...
但我发现它非常黑客而且从未真正起作用。我正在努力寻找更可靠的东西。有什么想法吗?
答案 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.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来说它应该是相同的。