Как сделать перенос строки в label
Помогите! Нигде в своих учебничках не могу найти, как переходить на новую строку в Memo.
Вот если для Label делаю Label->Caption="Строка \nс переносом", всё прекрасно: Результат:
Строка
с переносом.
Но такие компоненты как Memo ведут себя совершенно иначе. Они это \n воспринимают как перенос на новую строку, только отображают символ "|", что уже совсем не понятно, и в самом окне Memo всё-равно пишут в одну строку:
Строка|с переносом.
А дальше ещё непонятнее. Если сохраняю этот текст (эту строку) с такими разделителями в файле с расширением *txt и открываю, например, в болкноте — опять абра-кадабра: одна строка, на этот раз с квадратиками в качестве разделителей. Но если эту строку сохранить в формате *doc или там *rtf и открыть в Word или WordPad, всё в таком виде, как хотелось бы видеть в Memo или текстовом файле:
Строка
с переносом.
Как можно получить функциональность переноса слов Label для текста, который выходит за пределы?
Быстрый ответ: выключите AutoSize .
Большая проблема здесь в том, что метка не изменит свою высоту автоматически (только ширина). Чтобы сделать это правильно, вам нужно будет создать подкласс метки и включить логику вертикального изменения размера.
В основном, что вам нужно сделать в OnPaint:
- Измерьте высоту текста (Graphics.MeasureString).
- Если высота надписи не равна высоте текста, установите высоту и вернитесь.
- Нарисуй текст.
Вам также нужно будет установить флаг стиля ResizeRedraw в конструкторе.
Выберите метку, к которой вы динамически добавляете текст. Посмотрите на свойства метки и выключите AutoSize. Теперь вы сможете перетаскивать / устанавливать область для метки, и она автоматически будет переноситься в соответствии с этими параметрами. Нет необходимости в каком-либо дополнительном кодировании.
Это именно то, что я искал, поскольку это касается форматирования моей формы с пояснительным текстом в форме абзаца.
@madeFromCode Вам нужно установить высоту программно, если вы хотите, чтобы метка расширялась по вертикали, иначе ваш текст будет обрезан.
На самом деле, принятый ответ излишне сложен.
Если вы установите метку в AutoSize, она будет автоматически расти вместе с тем текстом, который вы в нее поместите. (Это включает вертикальный рост.)
Если вы хотите сделать перенос слов определенной ширины, вы можете установить свойство MaximumSize.
Проверено и работает.
Если у вас есть метка, привязанная к ее контейнеру, вы можете отключить AutoSize, оставить свойство максимального размера как есть, и оно будет переносить слова точно так, как мы хотим. ПОЦЕЛУЙ на работе!
Сэм: вы должны иметь возможность установить Dock свойство как метки, так и панели Top вместо моего решения.
В моем случае (метка на панели) я установил label.AutoSize = false и label.Dock = Fill . И текст метки оборачивается автоматически.
Это заставляет метку заполнять всю форму и скрывать все остальные элементы управления в форме . То есть она не работает. Существуют ли другие требования, которые не заполнили бы всю форму?
Это похоже на какой-то дополнительный макет, который должен быть ненужным. Конечно, этикетка должна иметь свою собственную коробку, а не помещать ее в другую коробку.
Свойство autowrap отсутствует, но это можно сделать программно для его динамического определения размера. Вот одно из решений:
Выберите свойства метки
AutoSize знак равно True
MaximumSize = ( Ширина , высота ) где ширина = максимальный размер метки, а высота = количество пикселей, которое нужно обернуть
Еще одно примечание: если вы оставите максимальную высоту равной 0, она будет продолжать расширяться по вертикали.
Чтобы разбить символы, а не слова (полезно, если у вас длинные строки без пробелов, например путей к файлам), используйте вместо этого (TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl). Смотрите последний пост в той же теме MSDN.
Кроме того, не забудьте включить верхний и нижний отступы метки в расчет ( Height = sz.Height + Padding.Vertical; )
Мне нужно было найти быстрое решение, поэтому я просто использовал TextBox со следующими свойствами:
Это оригинальное решение, которое также хорошо работает на Compact Framework (где у Label нет свойств AutoSize и MaximumSize).
Иметь лучший на основе ответа @hypo
int width = this.Parent == null ? this.Width : this.Parent.Width; это позволяет вам использовать метку автоматического увеличения при прикреплении к родителю, например к панели.
this.Height = sz.Height + Padding.Bottom + Padding.Top; здесь мы позаботимся о прокладке сверху и снизу.
Обработайте ClientSizeChanged event панель, чтобы метка заполнила пространство:
Установить Auto-Size для ярлыка true
Они сделаны в конструкторе (но могут быть выполнены в коде, если вам это нужно), и нет причин для заказа.
Не уверен , что это будет соответствовать все примеры использования , но я часто использую простой трюк , чтобы получить поведение оберточной: положить ваши Label с AutoSize=false внутри 1x1 , TableLayoutPanel который будет заботиться о Label размере «s.
Установите для свойства AutoEllipsis значение TRUE, а для свойства AutoSize - значение FALSE.
Если ваша панель ограничивает ширину вашей метки, вы можете установить свойство привязки вашей метки влево, вправо и установить для AutoSize значение true. Концептуально это похоже на прослушивание SizeChanged события Panel и обновление MaximumSize метки до a, new Size(((Control)sender).Size.Width, 0) как было предложено в предыдущем ответе. . Каждая сторона, указанная в свойстве Anchor, хорошо привязана к соответствующей внутренней стороне содержащего элемента управления. Таким образом, перечисление двух противоположных сторон в Anchor эффективно устанавливает размерность элемента управления. Привязка к левому и правому краям устанавливает свойство Width элемента управления, а привязка к верхнему и нижнему элементам устанавливает его свойство Height.
Не работает Метка увеличивает ширину моей панели только для того, чтобы ее не нужно было оборачивать. К сожалению, окно не такое широкое.
Если вы действительно хотите установить ширину метки независимо от содержимого, я считаю, что самый простой способ это:
- Установите автоматический размер true
- Установите максимальную ширину так, как вы хотите
- Установите минимальную ширину одинаково
Теперь метка имеет постоянную ширину, но она автоматически адаптируется к своей высоте.
Затем для динамического текста уменьшите размер шрифта. При необходимости используйте этот фрагмент в подпрограмме, где установлен текст метки:
UserForm.Label – это элемент управления пользовательской формы, предназначенный для отображения на ней поясняющих надписей к другим элементам управления, меток, заметок, вывода дополнительной текстовой информации.
Элемент управления Label, как и другие элементы управления, реагирует на нажатия мышью, то есть его можно использовать для запуска подпрограмм, изменения собственных свойств, свойств пользовательской формы и других элементов управления.
Свойства элемента Метка
* При загруженной в надпись картинке свойство TextAlign не работает, следует использовать свойство PicturePosition.
Свойство по умолчанию для элемента Label – Caption, основное событие – Click.
В таблице перечислены только основные, часто используемые свойства надписи. Все доступные свойства отображены в окне Properties элемента управления Label.
Примеры кода VBA с Label
Пример 1
Загрузка элемента управления Label на пользовательскую форму с параметрами, заданными в коде VBA Excel:
Читайте также: