Jak umieścić nową linię w kontrolce WPF TextBlock?

103

Pobieram tekst z pliku XML i chciałbym wstawić kilka nowych wierszy, które są interpretowane przez renderowanie bloku tekstowego jako nowe wiersze.

Próbowałem:

<data>Foo bar baz \n baz bar</data>

Ale dane są nadal wyświetlane bez nowej linii. Ustawiłem zawartość za <data>pośrednictwem .Textwłaściwości za pośrednictwem C #.

Co muszę umieścić w XML, aby wyrenderował nowy wiersz w GUI?

Próbowałem czegoś takiego ręcznie ustawiając tekst w XAML:

<TextBlock Margin="0 15 0 0" Width="600">
There &#10;
is a new line.
</TextBlock>

I chociaż zakodowany znak nie pojawia się w GUI, to również nie daje mi nowej linii.

Tylko tu boliwijczyk
źródło
czy próbowałeś zawijać znak powrotu w „cudzysłowy” <data> Foo bar baz "\ n" baz bar </data>
MethodMan,
@DJKRAZE: Cytaty nic nie robią, ani r i n razem. : S
Tylko tutaj boliwijskie
@BalamBalam: To nie to samo, to pytanie dotyczy wprost atrybutu Text.
HB
Widzę, że całkowicie rozumiem, dlaczego „” teraz nie działa .. Zakładam, że <LineBreak> będzie wtedy bardziej jak dosłowne / kluczowe słowo. mój błąd .. Świetna odpowiedź HB
MethodMan
Dan Vogel opracował aktualne rozwiązanie robocze. WPF interpretuje \ r \ n do \\ r \\ n.
zORg Alex

Odpowiedzi:

176

Możesz spróbować wstawić nowy wiersz w danych:

<data>Foo bar baz 
 baz bar</data>

Jeśli to nie zadziała, może być konieczne ręczne przeanalizowanie ciągu.

Jeśli potrzebujesz bezpośredniego XAML, to jest proste:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
HB
źródło
Nie, to też nic nie daje. Skopiowałem nawet zawartość w XAML TextBlock z naciśnięciami Enter jako nowe wiersze i nadal wyświetla ją od razu.
Tylko boliwijczyk tutaj
3
@SergioTapia: istnieje różnica między przerwą w jakimś pliku danych a kodem XAML, analizator składni XAML ignoruje białe znaki, ale jeśli na przykład deserializujesz część XML za pomocą XmlSerializerprzerw, zostaną one zachowane. W Xaml potrzebujesz <LineBreak/>.
HB
Umieść nową linię bezpośrednio w danych ... oczywiście! Tutaj spędziłem dużo czasu próbując \ n, <LineBreak /> i mnóstwo kodów html, ale bezskutecznie. Powinienem był najpierw spróbować najprostszego podejścia.
thehelix
66

Dla kompletności: Możesz również zrobić to:

 <TextBlock Text="Line1&#x0a;Line 2"/>

x0A to szesnastkowy znak nowej linii ze zmianą znaczenia. Odpowiednik \ n

Ketobomb
źródło
2
Przydatne w wiązaniu w scenariuszu takim jak ten: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Name: {0} & # x0a; Code: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet
3
to najlepsza odpowiedź
Aurélio Antonio
Dodałbym ten link: stackoverflow.com/questions/9021649/… wyjaśnienie odpowiedzi.
krok
22

Możesz także użyć oprawy

<TextBlock Text="{Binding MyText}"/>

I ustaw MyText w ten sposób:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}
Gordon
źródło
9
Nie potrzebujesz nawet string.Format (). return "Mój tekst \ n Twój tekst"; działa dobrze.
Zodman
18

musisz użyć

 < SomeObject xml:space="preserve" > once upon a time ...
      this line will be below the first one < /SomeObject>

Lub jeśli wolisz:

 <SomeObject xml:space="preserve" />  once upon a time... &#10; this line below < / SomeObject>

uważaj: jeśli oboje użyjesz & 10 ORAZ przejdziesz do następnej linii w tekście, będziesz mieć DWA puste linie.

szczegóły tutaj: http://msdn.microsoft.com/en-us/library/ms788746.aspx

GameAlchemist
źródło
12

Chociaż jest to stare pytanie, właśnie natrafiłem na problem i rozwiązałem go inaczej niż podane odpowiedzi. Może mogłoby być pomocne dla innych.

Zauważyłem, że chociaż moje pliki XML wyglądały tak:

<tag>
 <subTag>content with newline.\r\nto display</subTag>
</tag>

Kiedy został wczytany do mojego kodu C #, ciąg miał podwójne ukośniki odwrotne.

\\r\\n

Aby to naprawić, napisałem ValueConverter, aby usunąć dodatkowy ukośnik odwrotny.

public class XmlStringConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        string valueAsString = value as string;
        if (string.IsNullOrEmpty(valueAsString))
        {
            return value;
        }

        valueAsString = valueAsString.Replace("\\r\\n", "\r\n");
        return valueAsString;
    }

    public object ConvertBack(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Dan Vogel
źródło
Oprócz konieczności dodawania TextWrapping="Wrap"(a AcceptsReturn="True"jeśli to byłby TextBox) w XAML na TextBlock, miałeś rację i to powinna być odpowiedź - ale po prostu powiedz, aby zrobić .Replace()na wartości pochodzącej z bazy danych - nie ma potrzeby fantazyjna funkcja: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); każda wartość wprowadzona za pomocą klawisza Return zostanie zapisana w bazie danych w porządku - wtedy, gdy C # przechwyci ją, aby wyświetlić wartość, która powoduje problemy, jak zauważyłeś. Musiałoby to więc nazywać się ładowaniem tekstu.
vapcguy
10

Jeśli wszystko inne zawiedzie, możesz również użyć

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"
Adrian
źródło
8
<TextBlock Margin="4" TextWrapping="Wrap" FontFamily="Verdana" FontSize="12">
        <Run TextDecorations="StrikeThrough"> Run cannot contain inline</Run>
        <Span FontSize="16"> Span can contain Run or Span or whatever 
            <LineBreak />
        <Bold FontSize="22" FontFamily="Times New Roman" >Bold can contains 
            <Italic>Italic</Italic></Bold></Span>
</TextBlock>
alkk
źródło
1

Korzystanie z System.Environment.NewLine jest jedynym rozwiązaniem, które zadziałało. Kiedy próbowałem \ r \ n, po prostu powtórzyłem rzeczywisty \ r \ nw polu tekstowym.

Zamówienie 23
źródło
0

Musisz upewnić się, że blok tekstowy ma włączoną tę opcję:

AcceptsReturn="True"
Dave
źródło
AcceptsReturn dotyczy tylko TextBox, a nie TextBlock
Steve
0

Wstaw „podział wiersza” lub „podział akapitu” w RichTextBox „rtb” w następujący sposób:

var range = new TextRange(rtb.SelectionStart, rtb.Selection.End); 
range.Start.Paragraph.ContentStart.InsertLineBreak();
range.Start.Paragraph.ContentStart.InsertParagraphBreak();

Jedynym sposobem uzyskania elementów NewLine jest najpierw wstawienie tekstu z elementami „\ r \ n”, a następnie zastosowanie większej ilości kodu, który działa na obiektach Selection i / lub TextRange. Daje to pewność, że elementy \ par są konwertowane na elementy \ line, są zapisywane zgodnie z potrzebami i nadal są poprawne po ponownym otwarciu pliku * .Rtf. To właśnie znalazłem do tej pory po ciężkich próbach. Moje trzy linie kodu muszą być otoczone większą ilością kodu (z pętlami), aby ustawić elementy TextPointer (.Start .End .ContentStart .ContentEnd) tam, gdzie powinny znajdować się wiersze i przerwy, co zrobiłem z powodzeniem dla moich celów.

Josh
źródło