Multilínea para WPF TextBox

364

Estoy desarrollando una aplicación para enviar algunos comentarios.

Básicamente estoy tratando de hacer TextBoxcomentarios, pero estoy acostumbrado a los WinForms MultiLine=true. Lo configuré MinLinesen 3, que es llegar allí, pero preferiblemente me gustaría que el usuario pueda escribir en cualquier parte de este bloque, como presionar enter y hacer puntos de punto. Por ejemplo:

- Item 1        blah
- Item 2                blahlb lahbvl   d

Pero en este momento todo el texto permanece en una línea.

- Item 1         blah - Item 2                      blahb blahb blah

Estos comentarios ayudarán a llenar el cuerpo de un correo electrónico que se envía. Puede no tener sentido si no puedo mantener fácilmente el mismo formato al colocar esta cadena en la cadena del cuerpo del correo electrónico (de modo que parezca que lo hace cuando se envía como lo hace cuando se escribe).

¿Puedo lograr lo que busco o debo dejarlo como texto en una línea?

barón
fuente

Respuestas:

757

Habilite TextWrapping="Wrap"y AcceptsReturn="True"en su TextBox.

También es posible que desee habilitar AcceptsTaby SpellCheck.IsEnabledtambién.

itowlson
fuente
1
Hola, @itowlson, si creo un cuadro de texto de varias líneas con su método, funciona mejor, pero si quiero establecer el contador de texto del cuadro de texto label1.Content = textBox1.Text.Length;con esta línea, funciona, pero cuando presiono Intro en el contador de cuadro de texto aumentará 2 caracteres. ¿Cómo puedo hacer esta tarea? Por favor, ayúdame.
Jay Shukla
2
Esto sucede porque la nueva línea tiene dos caracteres (CR / LF). Si quieres tratarlo como un solo personaje, haz algo como textBox1.Text.Replace("\r\n", " ").Length. Sin embargo, tenga cuidado: si esto se entiende como retroalimentación del usuario porque su back-end limita el número de caracteres, es posible que deba contar el CR / LF como dos caracteres si así es como lo contará el back-end.
itowlson
También pregunto este problema en este enlace stackoverflow.com/questions/18459908/…
Jay Shukla
1
También asegúrese de que VerticalContentAlignment esté configurado en Estirar
eran otzap
1
Agregue también el componente ScrollVewer circundante para tener una barra de desplazamiento.
Borko Djurovic
34

Además, si, como yo, agrega controles directamente en XAML (sin usar el editor), puede sentirse frustrado de que no se extienda a la altura disponible, incluso después de establecer esas dos propiedades.

Para hacer que TextBox se estire, configure el Height="Auto".

ACTUALIZAR:

En retrospectiva, creo que esto debe haber sido necesario gracias a un estilo predeterminado para TextBoxes que especifica la altura a algún estándar para la aplicación en algún lugar de los recursos de la aplicación. Puede valer la pena comprobar esto si esto te ayudó.

Andre Luus
fuente
19

Aquí está la muestra XAMLque permitirá TextBoxaceptar texto multilínea y usa sus propias barras de desplazamiento:

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

Al contrario de @Andre Luus, la configuración Height="Auto"no hará el TextBoxestiramiento. La solución que encontré fue establecerVerticalAlignment="Stretch"

Elkvis
fuente
1
El valor predeterminado para 'VerticalAlignment' es 'Stretch', consulte MSDN . Y sí, realmente funcionó para mí. Sin embargo, podría depender del control en el que colocó el cuadro de texto, ¿era algo no estándar?
Andre Luus
1
Otra posibilidad es que tenga un estilo predeterminado para cuadros de texto definidos en algún lugar del ámbito de ese cuadro de texto que definió un valor diferente para VerticalAlignment. Lo consultaría con Snoop.
Andre Luus
1
Si el contenedor es fijo, la altura automática no funcionará. Cada contenedor principal a la parte superior debe poder expandirse. Envolver en una barra de desplazamiento también funciona.
Lee Louviere
5

La única propiedad correspondiente en WPF a la

Propiedad Winforms :TextBox.Multiline = true

Es la WPF propiedad: TextBox.AcceptsReturn = true.

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

Todas las demás configuraciones, como VerticalAlignement, WordWrapetc., solo controlan cómo interactúa TextBox en la interfaz de usuario, pero no afecta el Multilinecomportamiento.

meneo de pantano
fuente