Attributo Newline in stringa


283

Come posso aggiungere un'interruzione di riga al testo quando viene impostato come attributo, ad esempio:

<TextBlock Text="Stuff on line1 \n Stuff on line2" />

Rompere nel formato esploso non è un'opzione per la mia situazione particolare. Ciò di cui ho bisogno è un modo per emulare quanto segue:

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>

Risposte:


553
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

È possibile utilizzare qualsiasi valore con codifica esadecimale per rappresentare un valore letterale. In questo caso, ho usato il feed di riga (carattere 10). Se vuoi fare "classico"vbCrLf , allora puoi usare&#x0d;&#x0a;

A proposito, nota la sintassi: è la e commerciale, una sterlina, la lettera x , quindi il valore esadecimale del carattere che vuoi, e infine un punto e virgola.

ANCHE: Per completezza, puoi associarti a un testo che ha già i feed di riga incorporati come una costante nel tuo codice o una variabile costruita in fase di esecuzione.


14
Apparentemente questo non funziona con i tag <TextBlock.Text> </ TextBlock.Text>.
Cavi

45
Ad oggi, ho 34 voti positivi su questa risposta, e ho dovuto ancora tornare indietro e controllare perché la sintassi è così arcaica.
Bob King

3
Assolutamente. Ho questo preferito. Devo venire a controllare tutto il tempo.
MojoFilter

4
'Archaic' ==> 'Arcane' :-)
Will Dean il

5
Funziona anche all'interno di un parametro di associazione quando si aggiunge una barra rovesciata come: ConverterParameter = 'Test \ & # x0a; Testo'
Sven

72

Può essere che tu possa usare l'attributo xml: space = "preserv" per conservare gli spazi nella sorgente XAML

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>

8
Puoi anche rimuovere xml: space = "preservare" e aggiungere <LineBreak /> tra le righe
utilBee

5
Va notato (alcuni anni dopo) che xml:space="preserve"manterranno anche gli spazi di rientro, che sono solitamente presenti in XAML. Quindi un esplicito <LineBreak />come suggerito sopra sembra essere una soluzione più pulita.
Zeus,

Grazie! Questa soluzione si adattava molto bene al mio codice di serializzazione basato su XAML.
Serafino,

Oh, ha funzionato perfettamente. Mi ha risparmiato così tanto il codice della piastra della caldaia. grazie
iam.Carrot il

57

Quando è necessario farlo in una stringa (ad esempio: nelle risorse), è necessario utilizzare i codici carattere xml:space="preserve" e commerciale:

<System:String x:Key="TwoLiner" xml:space="preserve">First line&#10;Second line</System:String>

O letterali newline nel testo:

<System:String x:Key="TwoLiner" xml:space="preserve">First line 
Second line</System:String>

Attenzione: se si scrive codice come il secondo esempio, è stata inserita sia un ritorno a capo, o un ritorno a capo e ritorno a capo, a seconda delle terminazioni di linea del sistema operativo e / o l'uso editor di testo. Ad esempio, se lo scrivi e lo impegni a git da un sistema linux, tutto può sembrare a posto - ma se qualcuno lo clona su Windows, git convertirà i tuoi finali di linea \r\ne in base a quale stringa è per te ... tu potrebbe spezzare il mondo.

Basta essere consapevoli di ciò quando si preservano gli spazi bianchi. Se scrivi qualcosa del genere:

<System:String x:Key="TwoLiner" xml:space="preserve">
First line 
Second line 
</System:String>

Hai effettivamente aggiunto quattro interruzioni di riga, probabilmente quattro ritorni a capo e potenzialmente spazio bianco in coda invisibile ...


10
A proposito, puoi semplicemente applicare l' xml:space="preserve"attributo ResourceDictionaryanche a, in modo da non doverlo applicare a ogni stringa di risorse.
ottobre

1
Senza la e commerciale funziona anche. Qualcosa del genere: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (con un'interruzione di riga tra Prima riga e Seconda riga)
vgaltes

1
Vorrei xml:space="preserve"
poterti

1
@trooper Ho appena fatto la modifica ed è stato lasciato all'approvazione di Jaykul / mod. E le ulteriori build di Jaykul hanno davvero chiarito i dettagli minori qui (dal momento che la mia modifica non ha dato l'output desiderato esattamente come desiderato). Nel complesso, direi che questa interazione aiuta a creare risposte ancora migliori anziché pubblicare le mie.
Anthony Lusardi,

21

Devi solo rimuovere <TextBlock.Text>e aggiungere semplicemente i tuoi contenuti come segue:

    <Grid Margin="20">
        <TextBlock TextWrapping="Wrap" TextAlignment="Justify" FontSize="17">
        <Bold FontFamily="Segoe UI Light" FontSize="70">I.R. Iran</Bold><LineBreak/>
        <Span FontSize="35">I</Span>ran or Persia, officially the <Italic>Islamic Republic of Iran</Italic>, 
        is a country in Western Asia. The country is bordered on the 
        north by Armenia, Azerbaijan and Turkmenistan, with Kazakhstan and Russia 
        to the north across the Caspian Sea.<LineBreak/>
        <Span FontSize="10">For more information about Iran see <Hyperlink NavigateUri="http://en.WikiPedia.org/wiki/Iran">WikiPedia</Hyperlink></Span>
            <LineBreak/>
            <LineBreak/>
            <Span FontSize="12">
                <Span>Is this page helpful?</Span>
                <Button Content="No"/>
                <Button Content="Yes"/>
            </Span>
    </TextBlock>
    </Grid>

inserisci qui la descrizione dell'immagine


E la domanda era " Come posso aggiungere un'interruzione di riga al testo quando viene impostato come attributo ", attributo, non elemento.
minuti

15

Si noti che per fare questo è necessario farlo nell'attributo Text non è possibile utilizzare il contenuto come

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

12

Forse qualcuno preferisce

<TextBlock Text="{Binding StringFormat='Stuff on line1{0}Stuff on line2{0}Stuff on line3',
                          Source={x:Static s:Environment.NewLine}}" />

con xmlns:s="clr-namespace:System;assembly=mscorlib".


Anche se aggiungi & # x0a; sembra funzionare da XAML, non dal codice. Questo lo fa.
DFF

11

Per coloro che hanno provato tutte le risposte a questa domanda e si stanno ancora grattando la testa sul perché nessuno di loro lavora per te, potresti esserti imbattuto in una forma del problema che ho riscontrato.

La mia TextBlock.Textproprietà si trovava all'interno di un ToolTipService.ToolTipelemento ed era collegata a una proprietà di un oggetto i cui dati venivano estratti da una procedura memorizzata SQL. Ora i dati di questa particolare proprietà all'interno della procedura memorizzata venivano estratti da una funzione SQL.

Dato che nulla aveva funzionato per me, ho rinunciato alla mia ricerca e ho creato la seguente classe di convertitori:

public class NewLineConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = string.Empty;

        if (value.IsNotNull())
        {
            s = value.ToString();

            if (s.Contains("\\r\\n"))
                s = s.Replace("\\r\\n", Environment.NewLine);

            if (s.Contains("\\n"))
                s = s.Replace("\\n", Environment.NewLine);

            if (s.Contains("&#x0a;&#x0d;"))
                s = s.Replace("&#x0a;&#x0d;", Environment.NewLine);

            if (s.Contains("&#x0a;"))
                s = s.Replace("&#x0a;", Environment.NewLine);

            if (s.Contains("&#x0d;"))
                s = s.Replace("&#x0d;", Environment.NewLine);

            if (s.Contains("&#10;&#13;"))
                s = s.Replace("&#10;&#13;", Environment.NewLine);

            if (s.Contains("&#10;"))
                s = s.Replace("&#10;", Environment.NewLine);

            if (s.Contains("&#13;"))
                s = s.Replace("&#13;", Environment.NewLine);

            if (s.Contains("<br />"))
                s = s.Replace("<br />", Environment.NewLine);

            if (s.Contains("<LineBreak />"))
                s = s.Replace("<LineBreak />", Environment.NewLine);
        }

        return s;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Ho finito per usare il Enivornment.NewLinemetodo dalla risposta di @dparker . Ho chiesto al convertitore di cercare ogni possibile rappresentazione testuale di una nuova riga e di sostituirla con Environment.NewLine.

Questo ha funzionato!

Tuttavia, ero ancora perplesso sul motivo per cui nessuno degli altri metodi ha funzionato con proprietà databound.

Ho lasciato un commento sulla risposta accettata di @ BobKing :

@BobKing: questo non sembra funzionare in ToolTipService.ToolTip quando si associa a un campo che ha i feed di linea incorporati da uno sproc SQL.

Ha risposto con:

@CodeMaverick Se stai vincolando il testo con le nuove righe incorporate, probabilmente dovrebbero essere valori di char 10 reali (o 13) e non le sentinelle XML. Questo è solo se vuoi scrivere nuove righe letterali nei file XAML.

Una lampadina si è spenta!

Sono entrato nella mia funzione SQL, ho sostituito le mie rappresentazioni testuali di newline con ...

CHAR( 13 ) + CHAR( 10 )

... rimosso il convertitore dalla mia TextBlock.Textassociazione, e proprio così ... ha funzionato!


9

L'ho trovato utile, ma ho riscontrato alcuni errori durante l'aggiunta a un tag "Content = ..." in XAML.

Avevo più righe nel contenuto e in seguito ho scoperto che il contenuto manteneva spazi bianchi anche se non l'ho specificato. così per aggirare quello e farlo "ignorare" lo spazio bianco, ho implementato come questo.

<ToolTip Width="200" Style="{StaticResource ToolTip}" 
         Content="'Text Line 1' 
                   &#x0a;&#x0d;'Text Line 2' 
                   &#x0a;&#x0d;'Text Line 3'"/>

spero che questo aiuti qualcun altro.

(L'output è composto da tre righe di testo con una riga vuota tra ciascuna.)


potresti essere meglio provare <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ToolTip>
Simon_Weaver

5

Mi rendo conto che questo è su una domanda più vecchia, ma volevo solo aggiungerlo

Environment.NewLine

funziona anche se lo fa attraverso il codice.


4
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

non è importante sapere ma ciò che si specifica tra i tag TextBlock è chiamato contenuto inline e va nella proprietà TextBlock.Inlines che è InlineCollection e contiene elementi di tipo Inline. Le sottoclassi di Inline sono Run e LineBreak, tra le altre. vedi TextBlock.Inlines


3

Inoltre non funziona con

<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>

Non è un grosso problema, ho solo bisogno di usare

<TextBlock Text="Cool &#x0a;Newline trick" />

anziché.


1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />

-1

Codice dietro la soluzione

private void Button1_Click(object sender, RoutedEventArgs e)
{
    System.Text.StringBuilder myStringBuilder = new System.Text.StringBuilder();
    myStringBuilder.Append("Orange").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Apple").AppendLine();
    myStringBuilder.Append("Banana").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Plum").AppendLine();
    TextBox1.Text = myStringBuilder.ToString();
}
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.