Nueva línea en el atributo de cadena

283

¿Cómo puedo agregar un salto de línea al texto cuando se establece como un atributo, es decir:

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

Desglosarlo en el formato explotado no es una opción para mi situación particular. Lo que necesito es alguna forma de emular lo siguiente:

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

Respuestas:

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

Puede usar cualquier valor codificado hexadecimalmente para representar un literal. En este caso, utilicé el avance de línea (char 10). Si quieres hacer "clásico" vbCrLf, entonces puedes usar&#x0d;&#x0a;

Por cierto, tenga en cuenta la sintaxis: es el ampersand, una libra, la letra x , luego el valor hexadecimal del personaje que desea y, finalmente, un punto y coma.

TAMBIÉN: Para completar, puede enlazar a un texto que ya tiene los avances de línea incrustados como una constante en su código, o una variable construida en tiempo de ejecución.

Bob King
fuente
14
Aparentemente, esto no funciona dentro de <TextBlock.Text> </ TextBlock.Text> Etiquetas.
tcables
45
A partir de hoy, tengo 34 votos a favor en esta respuesta, y todavía tenía que volver y verificar porque la sintaxis es muy arcaica.
Bob King
3
Absolutamente. Tengo este marcador. Tengo que venir a comprobarlo todo el tiempo.
MojoFilter
44
'Arcaico' ==> 'Arcano' :-)
Will Dean
55
Funciona incluso dentro de un parámetro de enlace al agregar una barra diagonal inversa como: ConverterParameter = 'Test \ & # x0a; Text'
Sven
72

Puede ser que pueda usar el atributo xml: space = "preserve" para preservar espacios en blanco en la fuente XAML

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
scrat789
fuente
8
También puede eliminar xml: space = "preserve" y agregar <LineBreak /> entre las líneas
útilBee
55
Cabe señalar (unos años más tarde) que xml:space="preserve"también mantendrá los espacios de sangría, que generalmente están presentes en XAML. Por lo tanto, lo explícito <LineBreak />como se sugirió anteriormente parece ser una solución más limpia.
Zeus
¡Gracias! Esta solución se ajustó muy bien a mi código de serialización basado en XAML.
Serafines
Oh, esto funcionó perfecto. Me ahorró mucho código de placa de caldera. gracias
iam
57

Cuando necesite hacerlo en una cadena (p. Ej .: en sus recursos), debe usar los códigos de caracteres xml:space="preserve" y signos de ampersand:

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

O nuevas líneas literales en el texto:

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

Advertencia: si se escribe un código como el segundo ejemplo, se ha insertado ya sea un salto de línea, o un retorno de carro y salto de línea, en función de los finales de línea de su sistema operativo y / o uso editor de texto. Por ejemplo, si escribe eso y lo compromete a git desde un sistema Linux, todo puede parecer bien, pero si alguien lo clona en Windows, git convertirá sus terminaciones de línea \r\ny dependiendo de para qué es su cadena ... podría romper el mundo

Solo tenga en cuenta eso cuando esté preservando el espacio en blanco. Si escribes algo como esto:

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

De hecho, ha agregado cuatro saltos de línea, posiblemente cuatro retornos de carro, y un espacio en blanco potencialmente invisible que es invisible ...

Jaykul
fuente
10
Por cierto, también puede aplicar el xml:space="preserve"atributo al ResourceDictionary, para que no necesite aplicarlo a cada cadena de recursos.
ocodo
1
Sin el ampersand también funciona. Algo como esto: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (con un salto de línea entre la primera línea y la segunda línea)
vgaltes
1
Desearía poder darte +10 porxml:space="preserve"
TimothyP
1
@trooper Acabo de hacer la edición y se dejó a la aprobación de Jaykul / mod. Y las nuevas construcciones de Jaykul realmente aclararon los detalles menores aquí (ya que mi edición no dio el resultado deseado exactamente como lo quería). En general, diría que esta interacción ayuda a crear respuestas aún mejores en lugar de publicar la mía.
Anthony Lusardi
21

Solo necesita eliminar <TextBlock.Text>y simplemente agregar su contenido de la siguiente manera:

    <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>

ingrese la descripción de la imagen aquí

SMMousavi
fuente
Y la pregunta era " ¿Cómo puedo agregar un salto de línea al texto cuando se establece como un atributo ", atributo, no elemento.
minutos
15

Tenga en cuenta que para hacer esto debe hacerlo en el atributo Texto, no puede usar el contenido como

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

fuente
12

Quizás alguien prefiera

<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".

LPL
fuente
Aunque agregue & # x0a; parece funcionar desde XAML, no desde el código. Este sí.
FDF
11

Para aquellos que han intentado todas las respuestas a esta pregunta y todavía se están rascando la cabeza de por qué ninguno de ellos funciona para usted, es posible que haya encontrado una forma del problema con el que me encontré.

Mi TextBlock.Textpropiedad estaba dentro de un ToolTipService.ToolTipelemento y estaba enlazada a una propiedad de un objeto cuyos datos se extraían de un procedimiento almacenado de SQL. Ahora los datos de esta propiedad en particular dentro del procedimiento almacenado se extraían de una función SQL.

Como nada me había funcionado, dejé mi búsqueda y creé la siguiente clase de convertidor:

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

Terminé teniendo que usar el Enivornment.NewLinemétodo de la respuesta de @ dparker . Le indiqué al convertidor que buscara cualquier representación textual posible de una nueva línea y la reemplazara por Environment.NewLine.

Esto funcionó!

Sin embargo, todavía estaba perplejo sobre por qué ninguno de los otros métodos funcionaba con propiedades enlazadas a datos.

Dejé un comentario sobre la respuesta aceptada de @ BobKing :

@BobKing: parece que esto no funciona en ToolTipService.ToolTip cuando se vincula a un campo que tiene los avances de línea incrustados desde un sproc SQL.

Él respondió con:

@CodeMaverick Si está vinculando al texto con las nuevas líneas incrustadas, probablemente deberían ser valores reales de 10 caracteres (o 13) y no los centinelas XML. Esto es solo si desea escribir nuevas líneas literales en archivos XAML.

¡Se encendió una bombilla!

Ingresé a mi función SQL, reemplacé mis representaciones textuales de nuevas líneas con ...

CHAR( 13 ) + CHAR( 10 )

... eliminé el convertidor de mi TextBlock.Textenlace, y así como así ... ¡funcionó!

Code Maverick
fuente
9

He encontrado esto útil, pero encontré algunos errores al agregarlo a una etiqueta "Contenido = ..." en XAML.

Tenía varias líneas en el contenido, y luego descubrí que el contenido mantenía espacios en blanco a pesar de que no especifiqué eso. para evitar eso y hacer que "ignore" el espacio en blanco, implementé algo como esto.

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

Espero que esto ayude a alguien más.

(La salida tiene las tres líneas de texto con una línea vacía entre cada una).

Neville
fuente
quizás sea mejor que intentes <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ToolTip>
Simon_Weaver
5

Me doy cuenta de que esto es una pregunta anterior, pero solo quería agregar eso

Environment.NewLine

También funciona si se hace esto a través del código.

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

no es que sea importante saberlo, pero lo que especifica entre las etiquetas TextBlock se llama contenido en línea y entra en la propiedad TextBlock.Inlines, que es una colección InlineCollection y contiene elementos de tipo Inline. Las subclases de Inline son Run y ​​LineBreak, entre otras. ver TextBlock.Inlines

usuario829755
fuente
3

Tampoco funciona con

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

No es gran cosa, solo necesito usar

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

en lugar.

Batgar
fuente
1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />
Ahmed Ghoneim
fuente
-1

Código detrás de la solución

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