¿Cómo poner una nueva línea en un control wpf TextBlock?


102

Estoy recuperando texto de un archivo XML y me gustaría insertar algunas líneas nuevas que el bloque de texto interpreta como líneas nuevas.

He intentado:

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

Pero los datos aún se muestran sin la nueva línea. Configuré el contenido de a <data>través de la .Textpropiedad a través de C #.

¿Qué necesito poner en el XML para que represente la nueva línea en la GUI?

Intenté algo como esto configurando manualmente el texto en el XAML:

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

Y aunque el carácter codificado no aparece en la GUI, tampoco me da una nueva línea.


¿Ha intentado envolver el carácter de retorno entre "comillas" <data> Foo bar baz "\ n" baz bar </data>
MethodMan

@DJKRAZE: Las citas no hacen nada, ni ryn juntas. : S
Solo bolivianos aquí

@BalamBalam: No es lo mismo, esa pregunta es explícitamente sobre el atributo Text.
HB

Veo que entiendo totalmente por qué "" no funcionará ahora ... Supongo que <LineBreak> sería más como una palabra literal / clave entonces. mi error .. Gran respuesta HB
MethodMan

Dan Vogel creó una solución de trabajo actualizada. WPF interpreta \ r \ n en \\ r \\ n.
zORg Alex

Respuestas:


174

Puede intentar poner una nueva línea en los datos:

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

Si eso no funciona, es posible que deba analizar la cadena manualmente.

Si necesita XAML directo, eso es fácil por cierto:

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

No, esto tampoco hace nada. Incluso he copiado y pegado el contenido dentro del XAML del TextBlock presionando enter como nuevas líneas y todavía lo muestra a la vez.
Solo bolivianos aquí

3
@SergioTapia: hay una diferencia entre tener la ruptura en algún archivo de datos y XAML, el analizador XAML ignora los espacios en blanco, pero si, por ejemplo, deserializa algo de XML utilizando XmlSerializerlas rupturas, se conservarán. En Xaml necesitas <LineBreak/>.
HB

Ponga la nueva línea directamente en los datos ... ¡por supuesto! Aquí pasé mucho tiempo probando \ n, <LineBreak /> y toneladas de códigos html en vano. Debería haber intentado primero el enfoque más simple.
thehelix

65

Para completar: también puede hacer esto:

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

x0A es el salto de línea hexadecimal escapado. El equivalente de \ n


2
Útil para enlazar en un escenario como este: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Nombre: {0} & # x0a; Código: {1}"> <Binding Path = "Nombre" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet

3
esta es la mejor respuesta
Aurélio Antonio

Agregaría este enlace: stackoverflow.com/questions/9021649/… una explicación a la respuesta.
I Paso

22

También puede utilizar el enlace

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

Y configure MyText así:

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

9
Ni siquiera necesitas el string.Format (). devuelve "Mi texto \ n Tu texto"; funciona bien.
Zodman

18

debes usar

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

O si lo prefieres:

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

cuidado: si ambos usan & 10 Y van a la siguiente línea en su texto, tendrán DOS líneas vacías.

aquí para obtener más detalles: http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

Aunque esta es una pregunta antigua, me encontré con el problema y lo resolví de manera diferente a las respuestas dadas. Quizás pueda ser útil para otros.

Noté que aunque mis archivos XML se veían así:

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

Cuando se leyó en mi código C #, la cadena tenía barras invertidas dobles.

\\r\\n

Para solucionar este problema, escribí ValueConverter para eliminar la barra invertida adicional.

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

Además de tener que agregar TextWrapping="Wrap"(y AcceptsReturn="True"si esto fuera un TextBox) en el XAML en el TextBlock, lo hizo bien, y esta debería ser la respuesta, pero solo diga que haga .Replace()el valor que proviene de la base de datos, no es necesario un Función elegante: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); cualquier valor ingresado con la tecla Retorno se escribirá en la base de datos sin problemas; es cuando C # lo toma para mostrar el valor que causan los problemas, como señaló. Así que esto debería llamarse como carga del texto.
vapcguy

10

Si todo lo demás falla, también puede usar

"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

Usar System.Environment.NewLine es la única solución que funcionó para mí. Cuando probé \ r \ n, simplemente repitió el \ r \ n real en el cuadro de texto.


0

Debe asegurarse de que el bloque de texto tenga habilitada esta opción:

AcceptsReturn="True"

AcceptsReturn es solo para TextBox, no TextBlock
Steve

0

Inserte un "salto de línea" o un "salto de párrafo" en un RichTextBox "rtb" como este:

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

La única forma de obtener los elementos NewLine es insertando texto con elementos "\ r \ n" primero, y luego aplicando más código que funcione en los objetos Selection y / o TextRange. Esto asegura que los elementos de \ par se conviertan en elementos de línea, se guarden como se desee y sigan siendo correctos al volver a abrir el archivo * .Rtf. Eso es lo que encontré hasta ahora después de duros intentos. Mis tres líneas de código deben estar rodeadas de más código (con bucles) para configurar los elementos de TextPointer (.Start .End .ContentStart .ContentEnd) donde deberían ir las líneas y los descansos, lo que he hecho con éxito para mis propósitos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.