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.


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>

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


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

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


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

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"

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 é a única solução que funcionou para mim. Quando tentei \ r \ n, ele apenas repetiu o \ r \ n real na caixa de texto.


0

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

AcceptsReturn="True"

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.