Multiligne pour WPF TextBox

364

Je développe une application pour envoyer des commentaires.

Fondamentalement, j'essaie de faire un TextBoxpour les commentaires, mais je suis habitué aux WinForms MultiLine=true. J'ai réglé MinLinessur 3, ce qui est en train d'arriver, mais de préférence j'aimerais que l'utilisateur puisse taper n'importe où dans ce bloc - comme appuyer sur Entrée et faire une sorte de point. Par exemple:

- Item 1        blah
- Item 2                blahlb lahbvl   d

Mais pour le moment, le texte reste sur une seule ligne.

- Item 1         blah - Item 2                      blahb blahb blah

Ces commentaires permettront ensuite de remplir le corps d'un e-mail envoyé. Cela peut être inutile si je ne peux pas facilement conserver le même formatage lorsque je mets cette chaîne dans la chaîne du corps de l'e-mail (de sorte qu'elle ressemble à ce qu'elle est lorsqu'elle est envoyée comme elle le fait lors de la frappe).

Puis-je réaliser ce que je recherche ou dois-je le laisser comme tout le texte sur une seule ligne?

baron
la source

Réponses:

757

Activez TextWrapping="Wrap"et AcceptsReturn="True"sur votre TextBox.

Vous pouvez également activer AcceptsTabet SpellCheck.IsEnabledaussi.

itowlson
la source
1
hey @itowlson si je crée une zone de texte multiligne avec votre méthode, son travail est meilleur mais si je veux définir le compteur de texte de la zone de texte label1.Content = textBox1.Text.Length;avec cette ligne, son travail mais quand j'appuie sur Entrée dans le compteur de la zone de texte augmentera de 2 caractères. comment puis-je faire cette tâche s'il vous plaît aidez-moi.
Jay Shukla
2
Cela se produit car la nouvelle ligne est composée de deux caractères (CR / LF). Si vous voulez le traiter comme un seul personnage, faites quelque chose comme textBox1.Text.Replace("\r\n", " ").Length. Soyez prudent cependant: si cela est considéré comme une rétroaction de l'utilisateur car votre serveur principal limite le nombre de caractères, vous devrez peut-être compter le CR / LF comme deux caractères si c'est ainsi que le serveur principal le comptera!
Itowlson
Je pose également ce problème dans ce lien stackoverflow.com/questions/18459908/…
Jay Shukla
1
Assurez-vous également que VerticalContentAlignment est défini sur Stretch
eran otzap
1
Ajoutez également le composant ScrollVewer environnant afin d'avoir une barre de défilement.
Borko Djurovic
34

De plus, si, comme moi, vous ajoutez des contrôles directement en XAML (sans utiliser l'éditeur), vous pourriez être frustré qu'il ne s'étende pas à la hauteur disponible, même après avoir défini ces deux propriétés.

Pour étirer TextBox, définissez le Height="Auto".

MISE À JOUR:

Rétrospectivement, je pense que cela a dû être nécessaire grâce à un style par défaut pour TextBoxes spécifiant la hauteur à une norme pour l'application quelque part dans les ressources de l'application. Il peut être utile de vérifier cela si cela vous a aidé.

Andre Luus
la source
19

Voici l'exemple XAMLqui permettra TextBoxd'accepter du texte multiligne et il utilise ses propres Scrollbars:

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

Contrairement à @Andre Luus, le réglage Height="Auto"ne fera pas l' TextBoxétirement. La solution que j'ai trouvée était de mettreVerticalAlignment="Stretch"

Elkvis
la source
1
La valeur par défaut pour 'VerticalAlignment' est 'Stretch', reportez-vous à MSDN . Et oui, cela a vraiment fonctionné pour moi. Cela peut dépendre du contrôle dans lequel vous avez placé la zone de texte, était-ce quelque chose de non standard?
Andre Luus
1
Une autre probabilité est que vous ayez un style par défaut pour les zones de texte définies quelque part dans la portée de ce TextBox qui a défini une valeur différente pour VerticalAlignment. Je vérifierais avec Snoop.
Andre Luus
1
Si le conteneur est fixe, la hauteur auto ne fonctionnera pas. Chaque conteneur parent vers le haut doit pouvoir se développer. L'encapsulation dans une barre de défilement fonctionne également.
Lee Louviere
5

La seule propriété correspondant dans WPF au

Propriété Winforms :TextBox.Multiline = true

est la WPF propriété: TextBox.AcceptsReturn = true.

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

Tous les autres paramètres, tels que VerticalAlignement, WordWrapetc., contrôlent uniquement la façon dont la TextBox interagit dans l'interface utilisateur, mais n'affecte pas le Multilinecomportement.

marsh-wiggle
la source