Multiline dla WPF TextBox

364

Tworzę aplikację do przesyłania opinii.

Zasadniczo próbuję zrobić TextBoxkomentarz, ale jestem przyzwyczajony do WinForm MultiLine=true. Ustawiłem MinLines3, co się tam dzieje, ale najlepiej byłoby, gdyby użytkownik mógł pisać gdziekolwiek w tym bloku - na przykład naciśnij enter i rób punkty kropkowe. Na przykład:

- Item 1        blah
- Item 2                blahlb lahbvl   d

Ale w tej chwili tekst pozostaje w jednym wierszu.

- Item 1         blah - Item 2                      blahb blahb blah

Te komentarze pomogą następnie wypełnić treść wysłanego e-maila. Może to być bezcelowe, jeśli nie mogę łatwo zachować tego samego formatowania podczas umieszczania tego ciągu w treści wiadomości e-mail (tak, aby wyglądał tak, jak po wysłaniu, tak jak podczas pisania).

Czy mogę osiągnąć to, czego szukam, czy muszę to zostawić jako cały tekst w jednym wierszu?

baron
źródło

Odpowiedzi:

757

Włącz TextWrapping="Wrap"i AcceptsReturn="True"na TextBox.

Możesz także włączyć AcceptsTabi włączyć SpellCheck.IsEnabled.

itowlson
źródło
1
hej @itowlson, jeśli utworzę wieloliniowy pole tekstowe za pomocą Twojej metody, jego działanie będzie lepsze, ale jeśli chcę ustawić licznik tekstu label1.Content = textBox1.Text.Length;pola tekstowego w tej linii, jego działanie, ale po naciśnięciu Enter w polu tekstowym licznik zwiększy 2 znaki. jak mogę wykonać to zadanie, pomóżcie mi.
Jay Shukla,
2
Dzieje się tak, ponieważ nowa linia składa się z dwóch znaków (CR / LF). Jeśli chcesz traktować to jako pojedynczą postać, zrób coś takiego textBox1.Text.Replace("\r\n", " ").Length. Bądź jednak ostrożny: jeśli ma to być opinia użytkownika, ponieważ twój zaplecze ogranicza liczbę znaków, być może będziesz musiał policzyć CR / LF jako dwa znaki, jeśli tak to będzie liczyć!
itowlson
Zadaję również ten problem w tym linku stackoverflow.com/questions/18459908/…
Jay Shukla,
1
Upewnij się również, że VerticalContentAlignment jest ustawiony na Stretch
eran otzap
1
Dodaj także otaczający składnik ScrollVewer, aby mieć pasek przewijania.
Borko Djurovic
34

Ponadto, jeśli, podobnie jak ja, dodasz elementy sterujące bezpośrednio w XAML (nie używając edytora), możesz być sfrustrowany, że nie rozciągnie się na dostępną wysokość, nawet po ustawieniu tych dwóch właściwości.

Aby rozciągnąć TextBox, ustaw Height="Auto".

AKTUALIZACJA:

Patrząc wstecz, myślę, że musiało to być konieczne dzięki domyślnemu stylowi TextBox, określając wysokość do pewnego standardu dla aplikacji gdzieś w zasobach aplikacji. Warto to sprawdzić, jeśli to ci pomogło.

Andre Luus
źródło
19

Oto przykład XAML, który pozwoli TextBoxzaakceptować tekst wielowierszowy i używa własnych pasków przewijania:

<TextBox
Height="200"
Width="500"
TextWrapping="Wrap"
AcceptsReturn="True"
HorizontalScrollBarVisibility="Disabled"
VerticalScrollBarVisibility="Auto"/>
FireFalcon
źródło
12

W przeciwieństwie do @Andre Luus, ustawienie Height="Auto"nie spowoduje TextBoxrozciągnięcia. Rozwiązaniem, które znalazłem, było ustawienieVerticalAlignment="Stretch"

Elkvis
źródło
1
Domyślna wartość „VerticalAlignment” to „Stretch” odnosi się do MSDN . I tak, to naprawdę działało dla mnie. Może to zależeć od kontroli, w której umieściłeś pole tekstowe, czy było to coś niestandardowego?
Andre Luus
1
Innym prawdopodobieństwem jest to, że masz domyślny styl dla pól tekstowych zdefiniowanych gdzieś w zakresie tego TextBoxa, który zdefiniował inną wartość dla VerticalAlignment. Sprawdziłbym ze Snoopem.
Andre Luus
1
Jeśli pojemnik jest zamocowany, auto wysokość nie będzie działać. Każdy kontener nadrzędny na górę musi mieć możliwość rozszerzenia. Działa także zawijanie paska przewijania.
Lee Louviere,
5

Nieruchomość tylko odpowiada w WPF do

Właściwość Winforms :TextBox.Multiline = true

jest WPF właściwość: TextBox.AcceptsReturn = true.

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

Wszystkie inne ustawienia, takie jak VerticalAlignement, WordWrapitd., Tylko kontrolować, w jaki sposób współdziała TextBox w interfejsie, lecz nie wpływa na Multilinezachowanie.

wiggle marsh
źródło