Como colocar uma nova linha em um controle TextBlock wpf?

101

Estou obtendo texto de um arquivo XML e gostaria de inserir algumas novas linhas que são interpretadas pela renderização do bloco de texto como novas linhas.

Eu tentei:

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

Mas os dados ainda são exibidos sem a nova linha. Eu defino o conteúdo de<data> por meio da .Textpropriedade via C #.

O que preciso colocar no XML para que ele renderize a nova linha na GUI?

Tentei algo parecido com a configuração manual do texto no XAML:

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

E embora o caractere codificado não apareça na GUI, também não me dá uma nova linha.

Só boliviano aqui
fonte
você tentou envolver o caractere de retorno entre "aspas" <data> Foo bar baz "\ n" baz bar </data>
MethodMan
@DJKRAZE: As citações não fazem nada, nem r e n juntos. : S
Apenas boliviano aqui
@BalamBalam: Não é a mesma coisa, essa pergunta é explicitamente sobre o atributo Texto.
HB
Vejo que entendo totalmente porque "" não funciona agora. Estou assumindo que <LineBreak> seria mais como uma palavra-chave / literal. meu erro .. Ótima resposta HB
MethodMan
Dan Vogel criou uma solução de trabalho atualizada. O WPF interpreta \ r \ n em \\ r \\ n.
zORg Alex

Respostas:

173

Você pode tentar colocar uma nova linha nos dados:

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

Se isso não funcionar, pode ser necessário analisar a string manualmente.

Se você precisa de XAML direto, isso é fácil:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
HB
fonte
Não, isso não faz nada também. Eu até copiei e colei o conteúdo dentro do XAML do TextBlock pressionando Enter como novas linhas e ele ainda exibe de uma vez.
Apenas boliviano aqui
3
@SergioTapia: Há uma diferença entre ter a quebra em algum arquivo de dados e XAML, o analisador XAML ignora os espaços em branco, mas se você, por exemplo, desserializar algum XML usando o, XmlSerializeras quebras serão mantidas. No Xaml você precisa <LineBreak/>.
HB
Coloque a nova linha diretamente nos dados ... claro! Aqui, passei muito tempo tentando \ n, <LineBreak />, e toneladas de códigos html sem sucesso. Eu deveria ter tentado a abordagem mais simples primeiro.
thehelix
65

Para completar: você também pode fazer isto:

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

x0A é a alimentação de linha hexadecimal com escape. O equivalente a \ n

Ketobomb
fonte
2
Útil na vinculação em um cenário como este: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Nome: {0} & # x0a; Código: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet
3
esta é a melhor resposta
Aurélio Antonio
Eu adicionaria este link: stackoverflow.com/questions/9021649/… uma explicação para a resposta.
I.Step
22

Você também pode usar ligação

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

E defina MeuTexto assim:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}
Gordon
fonte
9
Você nem mesmo precisa da string.Format (). retornar "Meu Texto \ n Seu Texto"; funciona muito bem.
Zodman
18

você deve usar

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

Ou se preferir:

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

cuidado: se você usar & 10 E for para a próxima linha em seu texto, terá DUAS linhas vazias.

aqui para obter detalhes: http://msdn.microsoft.com/en-us/library/ms788746.aspx

GameAlchemist
fonte
12

Embora esta seja uma pergunta antiga, acabei de encontrar o problema e resolvê-lo de forma diferente das respostas fornecidas. Talvez possa ser útil para outras pessoas.

Percebi que, embora meus arquivos XML se pareçam com:

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

Quando foi lida em meu código C #, a string tinha barras invertidas duplas.

\\r\\n

Para corrigir isso, escrevi um ValueConverter para remover a barra invertida 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();
    }
}
Dan Vogel
fonte
Além de ter que adicionar TextWrapping="Wrap"(e AcceptsReturn="True"se este fosse um TextBox) no XAML no TextBlock, você acertou, e esta deve ser a resposta - mas apenas diga para fazer .Replace()no valor proveniente do banco de dados - não há necessidade de um função extravagante: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); qualquer valor inserido usando a tecla Return será gravado no banco de dados perfeitamente - é quando o C # o pega para exibir o valor que os problemas são causados, como você observou. Portanto, isso precisaria ser chamado no carregamento do texto.
vapcguy
10

Se tudo mais falhar, você também pode usar

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"
Adrian
fonte
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>
Alck
fonte
1

Usar System.Environment.NewLine é a única solução que funcionou para mim. Quando tentei \ r \ n, ele apenas repetiu o \ r \ n real na caixa de texto.

Ordem 23
fonte
0

Você deve garantir que o bloco de texto tenha esta opção habilitada:

AcceptsReturn="True"
Dave
fonte
AcceptsReturn é apenas para TextBox, não TextBlock
Steve
0

Insira uma "quebra de linha" ou "quebra de parágrafo" em um RichTextBox "rtb" como este:

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

A única maneira de obter os itens NewLine é inserindo texto com itens "\ r \ n" primeiro e, em seguida, aplicando mais código que funcione em objetos Selection e / ou TextRange. Isso garante que os itens \ par sejam convertidos em \ itens de linha, sejam salvos conforme desejado e ainda estejam corretos ao reabrir o arquivo * .Rtf. Isso é o que eu descobri até agora depois de muitas tentativas. Minhas três linhas de código precisam ser cercadas por mais código (com loops) para definir os itens TextPointer (.Start .End .ContentStart .ContentEnd) onde as linhas e quebras devem ir, o que fiz com sucesso para meus propósitos.

Josh
fonte