Multilinha para WPF TextBox

364

Estou desenvolvendo um aplicativo para enviar algum feedback.

Basicamente, estou tentando fazer TextBoxcomentários, mas estou acostumado com o WinForms MultiLine=true. Eu configurei MinLinespara 3, que está chegando lá, mas de preferência eu gostaria que o usuário pudesse digitar em qualquer parte deste bloco - como pressionar enter e fazer pontos por pontos. Por exemplo:

- Item 1        blah
- Item 2                blahlb lahbvl   d

Mas, no momento, todo o texto permanece em uma linha.

- Item 1         blah - Item 2                      blahb blahb blah

Esses comentários ajudarão a preencher o corpo de um email enviado. Pode ser inútil se eu não conseguir manter facilmente a mesma formatação ao colocar essa string na string do corpo do email (para que pareça quando é enviada quando é digitada).

Posso alcançar o que estou procurando ou tenho que deixá-lo como todo o texto em uma linha?

barão
fonte

Respostas:

757

Ative TextWrapping="Wrap"e AcceptsReturn="True"no seu TextBox.

Você também pode querer ativar AcceptsTabe SpellCheck.IsEnabledtambém.

Itowlson
fonte
11
hey @itowlson, se eu criar uma caixa de texto com várias linhas com o seu método, seu trabalho melhor, mas se eu quiser definir o contador de texto da caixa de texto label1.Content = textBox1.Text.Length;com esta linha, seu trabalho, mas quando eu pressionar enter no contador da caixa de texto, aumentará 2 caracteres. como posso fazer esta tarefa, por favor me ajude.
Jay Shukla
2
Isso acontece porque a nova linha possui dois caracteres (CR / LF). Se você quiser tratá-lo como um único personagem, faça algo parecido textBox1.Text.Replace("\r\n", " ").Length. Porém, tenha cuidado: se isso significa feedback do usuário porque seu back-end limita o número de caracteres, pode ser necessário contar o CR / LF como dois caracteres, se é assim que o back-end o contará!
itowlson
Peço também este problema neste link stackoverflow.com/questions/18459908/...
Jay Shukla
11
Também certifique-se de que VerticalContentAlignment está definido para esticar
eran otzap
11
Adicione também o componente ScrollVewer ao redor para ter a barra de rolagem.
Borko Djurovic
34

Além disso, se, como eu, você adicionar controles diretamente no XAML (sem usar o editor), poderá ficar frustrado por não esticar até a altura disponível, mesmo depois de definir essas duas propriedades.

Para fazer o TextBox esticar, defina o Height="Auto".

ATUALIZAR:

Em retrospecto, acho que isso deve ter sido necessário, graças a um estilo padrão para TextBoxes, especificando a altura de algum padrão para o aplicativo em algum lugar nos recursos do aplicativo. Pode valer a pena verificar isso se isso o ajudou.

Andre Luus
fonte
19

Aqui está o exemplo XAMLque permitirá TextBoxaceitar texto de várias linhas e usa suas próprias barras de rolagem:

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

Ao contrário de @Andre Luus, a configuração Height="Auto"não fará o TextBoxalongamento. A solução que encontrei foi definirVerticalAlignment="Stretch"

Elkvis
fonte
11
O valor padrão para 'VerticalAlignment' é 'Stretch', consulte MSDN . E sim, realmente funcionou para mim. No entanto, pode depender do controle em que você colocou a caixa de texto, era algo fora do padrão?
Andre Luus
11
Outra probabilidade é que você tenha um estilo padrão para caixas de texto definidas em algum lugar no escopo dessa caixa de texto que definiu um valor diferente para VerticalAlignment. Eu verificaria com Snoop.
Andre Luus
11
Se o contêiner estiver fixo, a altura automática não funcionará. Todo contêiner pai até o topo deve poder expandir. Quebrar em uma barra de rolagem também funciona.
18894 Lee Novel
5

A única propriedade correspondente no WPF ao

Propriedade Winforms :TextBox.Multiline = true

é o WPF propriedade: TextBox.AcceptsReturn = true.

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

Todas as outras configurações, como VerticalAlignement, WordWrapetc., controlam apenas como o TextBox interage na interface do usuário, mas não afeta o Multilinecomportamento.

marsh-wiggle
fonte