У меня есть функция, которую я использую, чтобы определить, когда строки текста превышают горизонтальные / вертикальные границы текстового поля, она отлично работает для текстового поля, у которого отключена перенос слов:
private bool OverflowsBounds(Direction dir) {
int textSize;
var flags = TextFormatFlags.NoClipping | TextFormatFlags.LeftAndRightPadding;
using(var g = textbox1.CreateGraphics()) {
if(dir == Direction.Horizontal) {
if(WordWrap) return false;
textSize = TextRenderer.MeasureText(g, textbox1.Text, textbox1.Font, new Size(int.MaxValue, int.MaxValue), flags).Width;
} else {
textSize = TextRenderer.MeasureText(g, textbox1.Text, textbox1.Font, new Size(int.MaxValue, int.MaxValue), flags).Height;
}
}
int textBounds = dir == Direction.Horizontal ? textbox1.ClientRectangle.Width : textbox1.ClientRectangle.Height;
return textSize >= textBound;
}
Но когда перенос слов включен, строка, которая переносится на новую строку, считается одной строкой. Так, если, например, высота текстового поля равна 100px, а для каждой строки - 20px, строка, которая обернута в 3 строки, будет 20px вместо 60px - поэтому 2 копии этой перенесенной строки будут определены как занимающие только 40px, когда они на самом деле превышают 100px bounds.
Я попытался внести это изменение:
textSize = TextRenderer.MeasureText(g, textbox1.Text, textbox1.Font, new Size(WordWrap ? textbox1.ClientRectangle.Width : int.MaxValue, int.MaxValue), flags).Height;
И также попытался использовать флаг WordBreak, но ни один из них не решил проблему.