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

101

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

Ich habe es versucht:

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

Die Daten werden jedoch weiterhin ohne die neue Zeile angezeigt. Ich setze den Inhalt von <data>über die .TextEigenschaft über C #.

Was muss ich in das XML einfügen, damit die neue Zeile in der GUI gerendert wird?

Ich habe versucht, den Text in der XAML manuell so einzustellen:

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

Und obwohl das codierte Zeichen nicht in der GUI angezeigt wird, gibt es mir auch keine neue Zeile.

Nur Bolivianer hier
quelle
Haben Sie versucht, das Rückgabezeichen in "Anführungszeichen" zu
verpacken?
@DJKRAZE: Zitate machen nichts, r und n auch nicht zusammen. : S
Nur Bolivianer hier
@BalamBalam: Es ist nicht dasselbe, diese Frage ist explizit über das Textattribut.
HB
Ich verstehe, dass ich vollkommen verstehe, warum "" jetzt nicht funktioniert. Ich gehe davon aus, dass <LineBreak> dann eher wie ein Literal / Schlüsselwort wäre. Mein Fehler. Tolle Antwort HB
MethodMan
Dan Vogel hat eine aktuelle Arbeitslösung entwickelt. WPF interpretiert \ r \ n in \\ r \\ n.
ZORg Alex

Antworten:

173

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>
HB
quelle
Nein, das macht auch nichts. Ich habe sogar den Inhalt in die XAML des TextBlock kopiert, indem ich die Eingabetaste als neue Zeile gedrückt habe, und er wird immer noch sofort angezeigt.
Nur Bolivianer hier
3
@SergioTapia: Es gibt einen Unterschied zwischen der Unterbrechung in einer Datendatei und XAML. Der XAML-Parser ignoriert Leerzeichen. Wenn Sie jedoch beispielsweise XML mithilfe XmlSerializerder Unterbrechungen deserialisieren , bleiben die Unterbrechungen erhalten. In Xaml brauchen Sie <LineBreak/>.
HB
Setzen Sie die neue Zeile direkt in die Daten ein ... natürlich! Hier habe ich viel Zeit damit verbracht, \ n, <LineBreak /> und jede Menge HTML-Codes ohne Erfolg auszuprobieren. Ich hätte zuerst den einfachsten Ansatz versuchen sollen.
Thehelix
65

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

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

x0A ist der maskierte hexadezimale Zeilenvorschub. Das Äquivalent von \ n

Ketobomb
quelle
2
Nützlich beim Binden in einem Szenario wie diesem: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Name: {0} & # x0a; Code: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </ MultiBinding> </TextBlock.Text> </ TextBlock>
Rajibdotnet
3
Dies ist die beste Antwort
Aurélio Antonio
Ich würde diesen Link hinzufügen: stackoverflow.com/questions/9021649/… eine Erklärung zur Antwort.
I.Schritt
22

Sie können auch die Bindung verwenden

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

Und stellen Sie MyText folgendermaßen ein:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}
Gordon
quelle
9
Sie brauchen nicht einmal den String.Format (). return "Mein Text \ n Dein Text"; funktioniert gut.
Zodman
18

Sie müssen verwenden

 < 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 für Details: http://msdn.microsoft.com/en-us/library/ms788746.aspx

GameAlchemist
quelle
12

Obwohl dies eine alte Frage ist, bin ich gerade auf das Problem gestoßen und habe es anders gelöst als die gegebenen Antworten. Vielleicht könnte es für andere hilfreich sein.

Ich bemerkte, dass meine XML-Dateien wie folgt aussahen:

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

Als es in meinen C # -Code eingelesen wurde, hatte die Zeichenfolge doppelte Backslashes.

\\r\\n

Um dies 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();
    }
}
Dan Vogel
quelle
Zusammen mit dem Hinzufügen TextWrapping="Wrap"(und AcceptsReturn="True"wenn dies eine TextBox wäre) in der XAML auf dem TextBlock hatten Sie es richtig, und dies sollte die Antwort sein - aber sagen Sie einfach, dass Sie .Replace()den Wert aus der Datenbank verwenden müssen - keine Notwendigkeit für a Ausgefallene Funktion: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); Jeder Wert, der mit der Eingabetaste eingegeben wird, wird problemlos in die Datenbank geschrieben. C # greift darauf zu, um den Wert anzuzeigen, den Probleme verursachen, wie Sie bemerkt haben. Dies müsste also als Onload des Textes bezeichnet werden.
Vapcguy
10

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"
Adrian
quelle
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
quelle
1

Die Verwendung von System.Environment.NewLine ist die einzige Lösung, die für mich funktioniert hat. Als ich \ r \ n ausprobiert habe, wurde nur das tatsächliche \ r \ n im Textfeld wiederholt.

Bestellung23
quelle
0

Sie müssen sicherstellen, dass für den Textblock diese Option aktiviert ist:

AcceptsReturn="True"
Dave
quelle
AcceptsReturn ist nur für TextBox, nicht TextBlock
Steve
0

Fügen Sie einen "Zeilenumbruch" oder einen "Absatzumbruch" wie folgt in eine RichTextBox "rtb" 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 abzurufen, besteht darin, zuerst Text mit "\ r \ n" -Elementen einzufügen und dann mehr Code anzuwenden, der für Auswahl- und / oder TextRange-Objekte funktioniert. Dadurch wird sichergestellt, dass die \ par-Elemente in \ Werbebuchungen konvertiert werden, wie gewünscht gespeichert werden und beim erneuten Öffnen der * .Rtf-Datei weiterhin korrekt sind. Das habe ich bisher nach harten Versuchen gefunden. Meine drei Codezeilen müssen von mehr Code (mit Schleifen) umgeben sein, um die TextPointer-Elemente (.Start .End .ContentStart .ContentEnd) dort festzulegen, wo die Zeilen und Unterbrechungen abgelegt werden sollen, was ich für meine Zwecke mit Erfolg getan habe.

Josh
quelle