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

102

Je récupère du texte à partir d'un fichier XML et j'aimerais insérer de nouvelles lignes qui sont interprétées par le rendu du bloc de texte comme de 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 .Textpropriété via C #.

Que dois-je mettre dans le XML pour qu'il affiche la nouvelle ligne dans l'interface graphique?

J'ai essayé quelque chose comme ça en définissant 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.

Seulement bolivien ici
la source
avez-vous essayé d'encapsuler le caractère de retour dans "quotes" <data> Foo bar baz "\ n" baz bar </data>
MethodMan
@DJKRAZE: Les citations ne font rien, ni r et n ensemble. : S
Only Bolivian Here
@BalamBalam: Ce n'est pas la même chose, cette question est explicite sur l'attribut Texte.
HB
Je vois que je comprends tout à fait pourquoi "" ne fonctionnera pas maintenant. Je suppose que <LineBreak> ressemblerait plus à un mot littéral / clé alors. mon erreur .. Grande réponse HB
MethodMan
Dan Vogel a créé une solution de travail à jour. WPF interprète \ r \ n en \\ r \\ n.
zORg Alex

Réponses:

174

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 d'ailleurs:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
HB
la source
Non, cela ne fait rien aussi bien. J'ai même copié-collé le contenu à l'intérieur du XAML du TextBlock avec des pressions d'entrée en tant que nouvelles lignes et il l'affiche toujours à la fois.
Only Bolivian Here
3
@SergioTapia: Il y a une différence entre avoir la rupture dans un fichier de données et XAML, l'analyseur XAML ignore les espaces, mais si vous, par exemple, désérialisez du XML en utilisant XmlSerializerles ruptures seront conservées. En Xaml, vous avez besoin <LineBreak/>.
HB du
Mettez la nouvelle ligne directement dans les données ... bien sûr! Ici, je viens de passer beaucoup de temps à essayer \ n, <LineBreak /> et des tonnes de codes html en vain. J'aurais dû essayer l'approche la plus simple en premier.
thehelix
65

Par souci d'exhaustivité: vous pouvez également faire ceci:

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

x0A est le saut de ligne hexadécimal échappé. L'équivalent de \ n

Ketobomb
la source
2
Utile pour la liaison dans un scénario tel que celui-ci: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Nom: {0} & # x0a; Code: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet
3
c'est la meilleure réponse
Aurélio Antonio
J'ajouterais ce lien: stackoverflow.com/questions/9021649/… une explication à la réponse.
I.Step
22

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");}
}
Gordon
la source
9
Vous n'avez même pas besoin de la chaîne.Format (). retourne "Mon texte \ n Votre texte"; fonctionne très bien.
Zodman le
18

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

GameAlchemist
la source
12

Même si c'est une vieille question, je viens de rencontrer le problème et je l'ai résolu différemment des réponses données. Cela pourrait peut-être ê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>

Lorsqu'elle était lue 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 pour 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();
    }
}
Dan Vogel
la source
En plus d'avoir à ajouter TextWrapping="Wrap"(et AcceptsReturn="True"s'il s'agissait d'un TextBox) dans le XAML sur le TextBlock, vous aviez raison, et cela devrait être la réponse - mais dites simplement de faire le .Replace()sur la valeur provenant de la base de données - pas besoin d'un fonction fantaisie: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); toute valeur entrée à l'aide de la touche Retour sera écrite dans la base de données très bien - c'est lorsque C # la prend en main pour afficher la valeur que les problèmes sont causés, comme vous l'avez noté. Cela devrait donc être appelé lors du chargement du texte.
vapcguy
10

Si tout le reste échoue, vous pouvez également utiliser

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

Utiliser System.Environment.NewLine est la seule solution qui a fonctionné pour moi. Quand j'ai essayé \ r \ n, il a simplement répété le \ r \ n réel dans la zone de texte.

Commande23
la source
0

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

AcceptsReturn="True"
Dave
la source
AcceptsReturn est uniquement pour TextBox, pas TextBlock
Steve
0

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

La seule façon d'obtenir les éléments NewLine est d'insérer d'abord du texte avec les éléments "\ r \ n", puis d'appliquer plus de code qui fonctionne sur les objets Selection et / ou TextRange. Cela garantit que les éléments \ par sont convertis en \ éléments de ligne, sont enregistrés comme vous le souhaitez et sont toujours corrects lors de la réouverture du fichier * .Rtf. C'est ce que j'ai trouvé jusqu'ici après de durs efforts. 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 pauses devraient aller, ce que j'ai fait avec succès pour mes besoins.

Josh
la source