web-dev-qa-db-ger.com

Wie füge ich eine neue Zeile in ein Wpf-TextBlock-Steuerelement ein?

Ich rufe Text aus einer XML-Datei ab, und ich möchte einige neue Zeilen einfügen, die vom Textblock als neue Zeilen interpretiert werden.

Ich habe es versucht:

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

Die Daten werden jedoch immer noch ohne die neue Zeile angezeigt. Ich lege den Inhalt von <data> über die .Text-Eigenschaft über C # fest.

Was muss ich in das XML einfügen, damit die neue Zeile in der GUI dargestellt werden kann?

Ich habe so etwas wie das manuelle Einstellen des Textes in der XAML versucht:

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

Und obwohl das codierte Zeichen nicht in der grafischen Benutzeroberfläche angezeigt wird, gibt es mir auch keine neue Zeile.

84

Sie können versuchen, eine neue Zeile in die Daten einzufügen:

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

Wenn dies nicht funktioniert, müssen Sie die Zeichenfolge möglicherweise manuell analysieren.

Wenn Sie direktes XAML benötigen, ist das übrigens einfach:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
154
H.B.

Der Vollständigkeit halber können Sie auch folgendes tun:

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

du musst benutzen

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

Oder wenn Sie es vorziehen:

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

achtung: Wenn Sie beide & 10 verwenden und zur nächsten Zeile in Ihrem Text gehen, haben Sie ZWEI leere Zeilen.

hier finden Sie Details: http://msdn.Microsoft.com/en-us/library/ms788746.aspx

18
GameAlchemist

Sie können auch die Bindung verwenden

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

Und setze MyText so:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}
18
Gordon

Obwohl dies eine alte Frage ist, bin ich einfach auf das Problem gestoßen und habe es anders gelöst als die gegebenen Antworten. Vielleicht könnte es anderen helfen.

Mir ist aufgefallen, dass meine XML-Dateien folgendermaßen aussehen:

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

Beim Einlesen in meinen C # -Code hatte die Zeichenfolge doppelte Backslashes.

\\r\\n

Um das zu beheben, habe ich einen ValueConverter geschrieben, um den zusätzlichen Backslash zu entfernen.

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();
    }
}
11
Dan Vogel

Wenn alles andere fehlschlägt, können Sie auch verwenden

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"
9
Adrian
<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>
8
alkk

Die Verwendung von System.Environment.NewLine ist die einzige Lösung, die für mich funktioniert hat. Wenn ich\r\n versuchte, wiederholte es lediglich das tatsächliche\r\n im Textfeld.

0
Order23

Sie müssen sicherstellen, dass im Textblock diese Option aktiviert ist:

AcceptsReturn="True"
0
Dave

Fügen Sie einen "Zeilenumbruch" oder einen "Absatzumbruch" in eine RichTextBox "rtb" wie folgt ein:

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

Die einzige Möglichkeit, die NewLine-Elemente zu erhalten, besteht darin, zuerst Text mit "\ r\n" -Elementen einzufügen und dann weiteren Code anzuwenden, der für Selection- und/oder TextRange-Objekte geeignet ist. Dadurch wird sichergestellt, dass die\par-Elemente in\Werbebuchungen konvertiert werden, wie gewünscht gespeichert werden und beim erneuten Öffnen der * .Rtf-Datei immer noch korrekt sind. Das habe ich bisher nach harten Versuchen herausgefunden. Meine drei Codezeilen müssen von weiterem Code (mit Schleifen) umgeben sein, um die TextPointer-Elemente (.Start .End .ContentStart .ContentEnd) dahin zu setzen, wo die Zeilen und Unterbrechungen eingefügt werden sollen, was ich für meine Zwecke mit Erfolg getan habe.

0
Josh