Mehrzeilig für WPF TextBox

364

Ich entwickle eine App, um Feedback zu senden.

Grundsätzlich versuche ich, TextBoxKommentare abzugeben, bin aber an die WinForms gewöhnt MultiLine=true. Ich habe MinLinesauf 3 gesetzt, was dort ankommt, aber am liebsten würde es mir gefallen, wenn der Benutzer in der Lage ist, überall in diesem Block zu tippen - wie zum Beispiel die Eingabetaste drücken und Punktpunkte machen. Zum Beispiel:

- Item 1        blah
- Item 2                blahlb lahbvl   d

Im Moment bleibt der Text jedoch in einer Zeile.

- Item 1         blah - Item 2                      blahb blahb blah

Diese Kommentare helfen dann dabei, den Text einer E-Mail zu füllen, die gesendet wird. Es kann sinnlos sein, wenn ich beim Einfügen dieser Zeichenfolge in die E-Mail-Textzeichenfolge nicht einfach die gleiche Formatierung beibehalten kann (so dass es beim Senden genauso aussieht wie beim Tippen).

Kann ich erreichen, wonach ich suche, oder muss ich den gesamten Text in einer Zeile belassen?

Baron
quelle

Antworten:

757

Aktivieren Sie TextWrapping="Wrap"und AcceptsReturn="True"auf Ihrer TextBox.

Möglicherweise möchten Sie auch aktivieren AcceptsTabund SpellCheck.IsEnabledauch.

itowlson
quelle
1
hey @itowlson, wenn ich ein mehrzeiliges Textfeld mit Ihrer Methode erstelle, funktioniert es besser, aber wenn ich den Textfeld-Textzähler label1.Content = textBox1.Text.Length;mit dieser Zeile festlegen möchte, funktioniert dies, aber wenn ich die Eingabetaste im Textfeldzähler drücke, werden 2 Zeichen erhöht. Wie kann ich diese Aufgabe erledigen? Bitte helfen Sie mir.
Jay Shukla
2
Dies liegt daran, dass der Zeilenumbruch aus zwei Zeichen (CR / LF) besteht. Wenn Sie es als einen einzelnen Charakter behandeln möchten, tun Sie etwas wie textBox1.Text.Replace("\r\n", " ").Length. Seien Sie jedoch vorsichtig: Wenn dies als Benutzer-Feedback gedacht ist, weil Ihr Back-End die Anzahl der Zeichen begrenzt, müssen Sie die CR / LF möglicherweise als zwei Zeichen zählen, wenn das Back-End dies so zählt!
Itowlson
Ich frage dieses Problem auch in diesem Link stackoverflow.com/questions/18459908/…
Jay Shukla
1
Stellen Sie
1
Fügen Sie auch die umgebende ScrollVewer-Komponente hinzu, um eine Bildlaufleiste zu erhalten.
Borko Djurovic
34

Wenn Sie wie ich Steuerelemente direkt in XAML hinzufügen (ohne den Editor zu verwenden), werden Sie möglicherweise frustriert, dass sie sich auch nach dem Festlegen dieser beiden Eigenschaften nicht auf die verfügbare Höhe ausdehnen.

Um die TextBox zu dehnen, stellen Sie die ein Height="Auto".

AKTUALISIEREN:

Rückblickend denke ich, dass dies dank eines Standardstils für TextBoxen notwendig gewesen sein muss, der die Höhe eines Standards für die Anwendung irgendwo in den App-Ressourcen angibt. Es kann sich lohnen, dies zu überprüfen, wenn dies Ihnen geholfen hat.

Andre Luus
quelle
19

Hier ist das Beispiel XAML, das das TextBoxAkzeptieren von mehrzeiligem Text ermöglicht und eigene Bildlaufleisten verwendet:

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

Im Gegensatz zu @Andre Luus wird durch die Einstellung Height="Auto"die TextBoxDehnung nicht erreicht. Die Lösung, die ich fand, war zu setzenVerticalAlignment="Stretch"

Elkvis
quelle
1
Der Standardwert für 'VerticalAlignment' ist 'Stretch', siehe MSDN . Und ja, es hat wirklich bei mir funktioniert. Es könnte jedoch von der Steuerung abhängen, in der Sie das Textfeld platziert haben. War es etwas, das nicht dem Standard entspricht?
Andre Luus
1
Eine andere Wahrscheinlichkeit besteht darin, dass Sie einen Standardstil für Textfelder haben, die irgendwo im Bereich dieser TextBox definiert sind und einen anderen Wert für VerticalAlignment definiert haben. Ich würde mich bei Snoop erkundigen.
Andre Luus
1
Wenn der Container fixiert ist, funktioniert die automatische Höhe nicht. Jeder übergeordnete Container nach oben muss erweitert werden können. Das Einschließen in eine Bildlaufleiste funktioniert auch.
Lee Louviere
5

Die einzige Eigenschaft, die in WPF der entspricht

Winforms- Eigenschaft:TextBox.Multiline = true

ist die WPF- Eigenschaft : TextBox.AcceptsReturn = true.

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

Alle anderen Einstellungen, wie zum Beispiel VerticalAlignement, WordWrapusw., nur steuern , wie die TextBox wirkt in der Benutzeroberfläche jedoch nicht die Auswirkungen auf das MultilineVerhalten.

Sumpf wackeln
quelle