TextRenderer.MeasureText() и максимальная длина текста в текстовом поле
У меня длинная строка (~100 тыс. Символов). Мне нужно знать длину этой строки. Я звоню
Size s = TextRenderer.MeasureText(graphics, text, font);
Но он возвращает ширину, равную 7. Только если длина текста <= 43679, он возвращает правильное значение!
Кроме того, если я вставлю текст в текстовое поле, текст не будет виден в текстовом поле! Я могу выделить текст мышью, скопировать с помощью "Ctrl+C", но текст не отображается. Свойство MaxLength больше длины текста.
Я посмотрел на msdn, но не нашел никакой информации о максимальной длине текста, которая используется в MeasureText и TextBox.
Где я могу найти документацию по этому поводу? Есть ли способ увеличить максимальную длину текста? Эти значения зависят от операционной системы и производительности компьютера?
2 ответа
Попробуйте использовать этот код для измерения строк, текстовый переводчик не является точным
protected int _MeasureDisplayStringWidth ( Graphics graphics, string text, Font font )
{
if ( text == "" )
return 0;
StringFormat format = new StringFormat ( StringFormat.GenericDefault );
RectangleF rect = new RectangleF ( 0, 0, 1000, 1000 );
CharacterRange[] ranges = { new CharacterRange ( 0, text.Length ) };
Region[] regions = new Region[1];
format.SetMeasurableCharacterRanges ( ranges );
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;
regions = graphics.MeasureCharacterRanges ( text, font, rect, format );
rect = regions[0].GetBounds ( graphics );
return (int)( rect.Right );
}
кредит на проблему с TextRenderer.MeasureText
Кроме того, попробуйте использовать string Builder с длинными строками, а затем даже разбить строки на более мелкие, измерить их и сложить вместе.
Подобный пример был приведен здесь. Также они обратились к проблеме maxLength на MSDN
Важно: посмотрите, как MaxLength используется в статье.
private static void DrawALineOfText(PaintEventArgs e)
{
// Declare strings to render on the form.
string[] stringsToPaint = { "Tail", "Spin", " Toys" };
// Declare fonts for rendering the strings.
Font[] fonts = { new Font("Arial", 14, FontStyle.Regular),
new Font("Arial", 14, FontStyle.Italic),
new Font("Arial", 14, FontStyle.Regular) };
Point startPoint = new Point(10, 10);
// Set TextFormatFlags to no padding so strings are drawn together.
TextFormatFlags flags = TextFormatFlags.NoPadding;
// Declare a proposed size with dimensions set to the maximum integer value.
Size proposedSize = new Size(int.MaxValue, int.MaxValue);
// Measure each string with its font and NoPadding value and
// draw it to the form.
for (int i = 0; i < stringsToPaint.Length; i++)
{
Size size = TextRenderer.MeasureText(e.Graphics, stringsToPaint[i],
fonts[i], proposedSize, flags);
Rectangle rect = new Rectangle(startPoint, size);
TextRenderer.DrawText(e.Graphics, stringsToPaint[i], fonts[i],
startPoint, Color.Black, flags);
startPoint.X += size.Width;
}
}