Мультилінія для WPF TextBox


364

Я розробляю додаток для надсилання відгуків.

В основному я намагаюся зробити TextBoxкоментар, але я звик до WinForms MultiLine=true. Я встановив MinLines3, що потрапляє туди, але бажано, що мені хотілося б, якщо користувач зможе вводити кудись у цьому блоці - як натиснути клавішу enter і робити щось подібне до пунктів. Наприклад:

- Item 1        blah
- Item 2                blahlb lahbvl   d

Але на даний момент текст залишається на одному рядку.

- Item 1         blah - Item 2                      blahb blahb blah

Ці коментарі потім допоможуть заповнити тіло електронного листа, яке надсилається. Це може бути безглуздим, якщо я не можу легко зберегти те саме форматування при введенні цього рядка в рядок тіла електронної пошти (щоб він виглядав так, як це відбувається при надсиланні, як це робиться під час введення).

Чи можу я досягти того, що я шукаю, чи потрібно залишити це як весь текст в одному рядку?

Відповіді:


757

Увімкніть TextWrapping="Wrap"і AcceptsReturn="True"на вашому TextBox.

Ви також можете включити AcceptsTabі SpellCheck.IsEnabledтеж.


1
Ей @itowlson, якщо я створюю багаторядковий текстовий ящик з вашим методом, його робота краще, але якщо я хочу встановити лічильник текстового поля за label1.Content = textBox1.Text.Length;допомогою цього рядка, його робота, але коли я натискаю Enter, у лічильнику текстового поля буде збільшуватися два символи. як я можу виконати це завдання, будь ласка, допоможіть мені.
Джей Шукла

2
Це відбувається тому, що новий рядок - це два символи (CR / LF). Якщо ви хочете ставитися до цього як до одного персонажа, зробіть щось подібне textBox1.Text.Replace("\r\n", " ").Length. Однак будьте обережні: якщо це розуміється як зворотній зв'язок з користувачем, оскільки ваш задній кінець обмежує кількість символів, можливо, вам доведеться рахувати CR / LF як два символи, якщо саме так буде підраховано його зворотній кінець!
itowlson

Я також задаю цю проблему в цьому посиланні stackoverflow.com/questions/18459908/…
Jay Shukla

1
Також переконайтесь, що VerticalContentAlignment встановлено на Stretch
eran otzap

1
Також додайте навколишній компонент ScrollVewer, щоб мати смугу прокрутки.
Борко Джурович

34

Крім того, якщо, як і я, ви додасте елементи керування безпосередньо в XAML (не використовуючи редактор), ви можете засмутитися, що він не розтягнеться на доступну висоту навіть після встановлення цих двох властивостей.

Щоб розтягнути TextBox, встановіть Height="Auto".

ОНОВЛЕННЯ:

В ретроспективі я думаю, що це, мабуть, було необхідне завдяки стилю TextBoxes за замовчуванням із зазначенням висоти до певного стандарту для програми десь у ресурсах програми. Це, можливо, варто перевірити, якщо це допомогло вам.


19

Ось зразок, XAMLякий дозволить TextBoxприймати багаторядковий текст, і він використовує власні смуги прокрутки:

<TextBox
Height="200"
Width="500"
TextWrapping="Wrap"
AcceptsReturn="True"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"/>

12

Всупереч @Andre Luus, налаштування Height="Auto"не призведе до TextBoxрозтягування. Я знайшов рішення, яке було встановитиVerticalAlignment="Stretch"


1
Значенням за замовчуванням для 'VerticalAlignment' є 'Stretch', що стосується MSDN . І так, це справді працювало для мене. Це може залежати від контролю, в який ви розмістили текстове поле, чи це було щось нестандартне?
Андре Луус

1
Інша ймовірність полягає у тому, що у вас є стиль за замовчуванням для текстових полів, визначених десь у межах цього TextBox, який визначив інше значення для VerticalAlignment. Я би перевірив у Snoop.
Андре Луус

1
Якщо контейнер зафіксований, автоматичне встановлення висоти не працюватиме. Кожен батьківський контейнер до вершини повинен мати можливість розширюватися. Загортання в смугу прокрутки також працює.
Lee Louviere

5

Єдине властивість , відповідне в WPF до

Властивість Winforms :TextBox.Multiline = true

це WPF властивість: TextBox.AcceptsReturn = true.

<TextBox AcceptsReturn="True" ...... />

Усі інші налаштування, наприклад VerticalAlignement, WordWrapтощо, лише керують тим, як TextBox взаємодіє в інтерфейсі, але не впливають на Multilineповедінку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.