![]() |
Модераторы: gambit, Partizan |
![]() ![]() ![]() |
|
Atomic |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 23 Регистрация: 4.12.2006 Репутация: нет Всего: нет |
Нужно, задав жестко полю с текстом (label, textbox или др.) ширину, сделать автоподстройку высоты поля так, чтобы весь текст (мультилайн) был виден без скроллинга.
Из близкого нашел в label свойство AutoSize, но оно работает сразу по обоим осям, что не подходит. Может, кто-нибудь знает, как получить желаемое? |
|||
|
||||
Dmitriy_Donetsk |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 28.9.2006 Репутация: нет Всего: нет |
Возможно решение, которое я предложу не самое оптимальное, но тем
не менее работает. Итак, создаем textBox1, устанавливаем Width, который не будет меняться, далее в зависимости от количества строк в textBox1 (multiline) устанавливаем высоту (Height):
|
|||
|
||||
Atomic |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 23 Регистрация: 4.12.2006 Репутация: нет Всего: нет |
В этом решении есть много минусов, но другого и я не вижу.
Только одно но - при уменьшении TextBoxа меньше ширины строки, он переносит текст на следующую. Таким образом количество строк становится неопределенным. Известно только, что их не меньше textBox1.Lines.Length. После доработки, у меня получился такой вариант:
Но мне почему-то не очень нравится такое решение. Хотелось бы автоматизации. |
|||
|
||||
Naum |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 1 Всего: 15 |
Dmitriy_Donetsk,
зачем string tempArray, если нужно только количество строк?
А если шрифт другой.
А лучше добавить в класс формы поле (например, textHeight) и в событиях Form1_Load и textBox1_FontChanged пересчитывать его. А затем вместо g.MeasureString....... написать textHeight. -------------------- У нас всего два праздника Новый год и ТЯПница. |
||||
|
|||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 1 Всего: 15 |
А можно еще проще
Добавлено @ 11:37 Можное еще добавить "технологический зазор" +2. Это сообщение отредактировал(а) Naum - 21.12.2006, 11:49 -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: 3 Всего: 8 |
Naum, а у меня еще один вариант:
![]() |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: 3 Всего: 8 |
||||
|
||||
Atomic |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 23 Регистрация: 4.12.2006 Репутация: нет Всего: нет |
textBox1.Font.Height - это хорошо. Нужно где нибудь записать на салфетке.
А Convert.ToInt32(g.MeasureString(ctrl.Text, ctrl.Font,ctrl.Width).Height даже лучше, потому, что там есть .Width. Но заметил еще одну гадость - этот нехороший textBox переносит по словам. Соответственно, алгоритм подсчета строк должен быть довольно сложным. Или давать строки с запасом. |
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 1 Всего: 15 |
Может быть, но считаться быстрее будет конечно textBox1.Font.Heigt. -------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
DarkDragon |
|
|||
![]() GradVin ![]() ![]() Профиль Группа: Участник Сообщений: 296 Регистрация: 19.8.2006 Репутация: 3 Всего: 8 |
Ф-ция MeasureString - учитывает и WordWrap (перенос слов), но можно его отключить используя StringFormat, устанавливая флаг на NoWrap, но здесь это не нужно. Впринцепе можно пользоваться AutoHeight и на label, textbox и т. д.. |
|||
|
||||
Atomic |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 23 Регистрация: 4.12.2006 Репутация: нет Всего: нет |
||||
|
||||
yury_sh |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 29.1.2007 Репутация: 1 Всего: 1 |
К сожалению метод с MeasureString иногда врет. Не знаю, в чем дело - то ли фонт чуть-чуть не тот, то ли лейбл рисует текст чуть иначе чем функция MeasureString. Кроме того, чтобы его правильно реализовать, нужно учитывать рамку и ...Padding (?). И вообще, он зависит от имплементации лейбла - кто его знает с каким отступом, межстрочным интервалом и т.п. лейбл рисует текст.
Но есть способ еще красивее. Во всяком случае для лейбла работает как из пушки.
Документация по GetPreferredSize явно не говорит об этом, но экспериментально выходит, что функция всегда возвращает ширину <= переданной, и высоту необходимую при этой ширине. Это сообщение отредактировал(а) yury_sh - 29.1.2007, 15:29 |
|||
|
||||
Naum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 743 Регистрация: 7.9.2005 Где: Саратов, ул. Поса дского, 298 Репутация: 1 Всего: 15 |
yury_sh, имхо, заслуженный +1.
-------------------- У нас всего два праздника Новый год и ТЯПница. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |