web-dev-qa-db-fra.com

Comment mettre une nouvelle ligne dans un contrôle wpf TextBlock?

Je récupère le texte d'un fichier XML et j'aimerais insérer de nouvelles lignes interprétées par le rendu du bloc de texte en tant que nouvelles lignes.

J'ai essayé:

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

Mais les données sont toujours affichées sans la nouvelle ligne. J'ai défini le contenu de <data> via la propriété .Text via C #.

De quoi ai-je besoin pour insérer le code XML afin de pouvoir afficher la nouvelle ligne dans l'interface graphique?

J'ai essayé quelque chose comme ceci: définir manuellement le texte dans le XAML:

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

Et bien que le caractère encodé n'apparaisse pas dans l'interface graphique, il ne me donne pas non plus de nouvelle ligne.

84
Only Bolivian Here

Vous pouvez essayer de mettre une nouvelle ligne dans les données:

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

Si cela ne fonctionne pas, vous devrez peut-être analyser la chaîne manuellement.

Si vous avez besoin de XAML direct, c'est facile:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
154
H.B.

Pour être complet: Vous pouvez aussi faire ceci:

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

tu dois utiliser

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

Ou si vous préférez:

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

attention: si vous utilisez tous les deux & 10 ET que vous passez à la ligne suivante de votre texte, vous aurez deux lignes vides.

ici pour plus de détails: http://msdn.Microsoft.com/en-us/library/ms788746.aspx

18
GameAlchemist

Vous pouvez également utiliser la liaison

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

Et définissez MyText comme ceci:

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

Même s'il s'agit d'une vieille question, je viens de rencontrer le problème et de le résoudre différemment des réponses données. Peut-être que cela pourrait être utile aux autres.

J'ai remarqué que même si mes fichiers XML ressemblaient à:

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

Quand il a été lu dans mon code C #, la chaîne avait des doubles barres obliques inverses.

\\r\\n

Pour résoudre ce problème, j'ai écrit un ValueConverter afin de supprimer la barre oblique inverse supplémentaire.

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

Si tout échoue, vous pouvez également utiliser

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

L’utilisation de System.Environment.NewLine est la seule solution qui a fonctionné pour moi . Lorsque j’ai essayé,\r\n, elle ne faisait que répéter le fichier\r\n dans la zone de texte.

0
Order23

Vous devez vous assurer que cette option est activée pour le bloc de texte:

AcceptsReturn="True"
0
Dave

Insérez un "saut de ligne" ou un "saut de paragraphe" dans un RichTextBox "rtb" comme ceci:

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

Le seul moyen d’obtenir les éléments NewLine consiste à insérer d’abord du texte contenant les éléments "\ r\n", puis à appliquer un code supplémentaire qui fonctionne pour les objets Selection et/ou TextRange. Cela garantit que les éléments\par sont convertis en éléments de ligne, qu'ils sont enregistrés comme vous le souhaitez et qu'ils sont toujours corrects lors de la réouverture du fichier * .Rtf. C'est ce que j'ai trouvé jusqu'ici après de nombreux essais. Mes trois lignes de code doivent être entourées de plus de code (avec des boucles) pour définir les éléments TextPointer (.Start .End .ContentStart .ContentEnd) où les lignes et les ruptures doivent aller, ce que j'ai fait avec succès pour mes besoins.

0
Josh