В этом решении есть много минусов, но другого и я не вижу. Только одно но - при уменьшении TextBoxа меньше ширины строки, он переносит текст на следующую. Таким образом количество строк становится неопределенным. Известно только, что их не меньше textBox1.Lines.Length. После доработки, у меня получился такой вариант:
| Код | private void panel2_Resize(object sender, EventArgs e) { textBox1.Width = panel2.Width;//Это я так ширину устанавливаю. // А теперь подсчитам, сколько строк у нас реально получается int n = 1;// это - кол-во строк. 1 строка есть всегда. int k = 0;// а это вспомогательная переменная - кол-во букв в строке for (int i = 0; i < textBox1.Text.Length; i++ ) switch (textBox1.Text[i]) { case '\n': n++; k = 0; break;// перенос строки - увеличиваем кол-во строк на 1 case '\r': break;// второй символ переноса строки - нам и одного хватит. Но убрать его нужно, иначе он будет портить подсчет. default: k++; if (k * 6 >= this.panel2.Width-6 ) { k = 0; n++; }// если ширина строки достигла максимально допустимой, // то увеличиваем счетчик строк. // здесь k*6 - длинна полученной строки, а вторая 6 - это textbox1.margin.left+...rigth. // Здесь нужно как-то иначе получить ширину символа. break; }
textBox1.Height = n * 18;// '14' мне оказалось мало - при уменьшении textBoxа до ~5 символов терялось несколько строк. // С '18' строки не теряются, при крайних значениях ширины высота получается очень точно, // но при средних значениях добавляется несколько лишних строк. Но это не так смертельно. // А вообще, нужно от куда-то брать эту константу (как и ширину символов), а не подбирать. }
|
Но мне почему-то не очень нравится такое решение. Хотелось бы автоматизации. |