Come inserire una nuova riga in un controllo TextBlock di wpf?


102

Sto recuperando del testo da un file XML e vorrei inserire alcune nuove righe che vengono interpretate dal rendering del blocco di testo come nuove righe.

Ho provato:

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

Ma i dati vengono comunque visualizzati senza la nuova riga. Ho impostato il contenuto di <data>tramite la .Textproprietà tramite C #.

Cosa devo inserire nell'XML per renderizzare la nuova riga nella GUI?

Ho provato qualcosa di simile impostando manualmente il testo in XAML:

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

E mentre il carattere codificato non appare nella GUI, non mi dà nemmeno una nuova riga.


hai provato a racchiudere il carattere di ritorno tra "virgolette" <data> Foo bar baz "\ n" baz bar </data>
MethodMan

@DJKRAZE: le citazioni non fanno nulla, né r e n insieme. : S
Solo boliviano qui

@BalamBalam: non è la stessa cosa, questa domanda è esplicita sull'attributo Text.
HB

Vedo che capisco perfettamente perché "" non funziona ora .. Presumo che <LineBreak> sarebbe più simile a una parola chiave / letterale allora. errore mio .. Ottima risposta HB
MethodMan

Dan Vogel ha creato una soluzione di lavoro aggiornata. WPF interpreta \ r \ n in \\ r \\ n.
zORg Alex

Risposte:


174

Puoi provare a inserire una nuova riga nei dati:

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

Se non funziona, potrebbe essere necessario analizzare la stringa manualmente.

Se hai bisogno di XAML diretto, è facile a proposito:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>

No, anche questo non fa niente. Ho persino copiato e incollato il contenuto all'interno del XAML di TextBlock con invio preme come nuove righe e lo visualizza ancora in una volta.
Solo boliviano qui

3
@SergioTapia: c'è una differenza tra avere l'interruzione in alcuni file di dati e XAML, il parser XAML ignora gli spazi, ma se, ad esempio, deserializzi un po 'di XML usando XmlSerializerle interruzioni, le interruzioni verranno mantenute. In Xaml hai bisogno di <LineBreak/>.
HB

Metti la nuova riga direttamente nei dati ... ovviamente! Qui ho passato molto tempo a provare \ n, <LineBreak /> e tonnellate di codici html senza alcun risultato. Avrei dovuto provare prima l'approccio più semplice.
thehelix

65

Per completezza: puoi anche fare questo:

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

x0A è l'avanzamento riga esadecimale con escape. L'equivalente di \ n


2
Utile per l'associazione in uno scenario come questo: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Name: {0} & # x0a; Code: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet

3
questa è la risposta migliore
Aurélio Antonio

Vorrei aggiungere questo link: stackoverflow.com/questions/9021649/… una spiegazione alla risposta.
I. Passo

22

Puoi anche usare l'associazione

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

E imposta MyText in questo modo:

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

9
Non hai nemmeno bisogno della stringa.Format (). restituire "Il mio testo \ n Il tuo testo"; funziona bene.
Zodman

18

devi usare

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

Oppure se preferisci:

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

attenzione: se entrambi usate & 10 E andate alla riga successiva del vostro testo, avrete DUE righe vuote.

qui per i dettagli: http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

Anche se questa è una vecchia domanda, ho appena trovato il problema e l'ho risolto in modo diverso dalle risposte fornite. Forse potrebbe essere utile ad altri.

Ho notato che anche se i miei file XML avevano il seguente aspetto:

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

Quando è stato letto nel mio codice C #, la stringa aveva doppi backslash.

\\r\\n

Per risolvere questo problema ho scritto un ValueConverter per rimuovere la barra rovesciata extra.

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

Oltre a dover aggiungere TextWrapping="Wrap"(e AcceptsReturn="True"se questo fosse un TextBox) nel XAML sul TextBlock, avevi ragione, e questa dovrebbe essere la risposta, ma dì solo di fare .Replace()il valore proveniente dal database - non c'è bisogno di un funzione di fantasia: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); qualsiasi valore immesso utilizzando il tasto Invio verrà scritto nel DB perfettamente - è quando C # lo prende per visualizzare il valore che sono causati i problemi, come hai notato. Quindi questo dovrebbe essere chiamato caricamento del testo.
vapcguy

10

Se tutto il resto fallisce puoi anche usare

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"

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>

1

L'utilizzo di System.Environment.NewLine è l'unica soluzione che ha funzionato per me. Quando ho provato \ r \ n, ho semplicemente ripetuto il \ r \ n effettivo nella casella di testo.


0

Devi assicurarti che il blocco di testo abbia questa opzione abilitata:

AcceptsReturn="True"

AcceptsReturn è solo per TextBox, non TextBlock
Steve

0

Inserisci una "interruzione di riga" o una "interruzione di paragrafo" in un RichTextBox "rtb" come questo:

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

L'unico modo per ottenere gli elementi NewLine è inserire prima il testo con gli elementi "\ r \ n", quindi applicare altro codice che funzioni sugli oggetti Selection e / o TextRange. Ciò garantisce che gli elementi \ par vengano convertiti in \ line items, vengano salvati come desiderato e siano ancora corretti quando si riapre il file * .Rtf. Questo è quello che ho trovato finora dopo duri tentativi. Le mie tre righe di codice devono essere circondate da più codice (con loop) per impostare gli elementi TextPointer (.Start .End .ContentStart .ContentEnd) dove dovrebbero andare le linee e le interruzioni, cosa che ho fatto con successo per i miei scopi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.