303 votes

Newline dans un attribut de chaîne

Comment ajouter un retour à la ligne au texte lorsqu'il est défini comme un attribut, par exemple :

<TextBlock Text="Stuff on line1 \n Stuff on line2" />

L'éclater en format éclaté n'est pas une option pour ma situation particulière. Ce dont j'ai besoin, c'est d'un moyen d'émuler ce qui suit :

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>

13voto

LPL Points 9372

Peut-être que quelqu'un préfère

<TextBlock Text="{Binding StringFormat='Stuff on line1{0}Stuff on line2{0}Stuff on line3',
                          Source={x:Static s:Environment.NewLine}}" />

avec xmlns:s="clr-namespace:System;assembly=mscorlib" .

0 votes

Bien que l'ajout de semble fonctionner à partir de XAML, ce n'est pas le cas à partir du code. Celui-ci le fait.

0 votes

Je pense que c'est une bien meilleure solution, car les différents systèmes d'exploitation attendent des caractères différents pour la nouvelle ligne. De cette façon, les caractères corrects sont utilisés quel que soit le système d'exploitation sur lequel l'application fonctionne.

11voto

Code Maverick Points 9448

Pour ceux qui ont essayé toutes les réponses à cette question et qui sont toujours qui se demandent pourquoi aucune d'entre elles ne fonctionne pour vous, il se peut que vous ayez rencontré une forme du problème que j'ai rencontré.

Mon TextBlock.Text était à l'intérieur d'un ToolTipService.ToolTip et il était lié aux données d'une propriété d'un objet dont les données étaient extraites d'une procédure stockée SQL. Les données de cette propriété particulière dans la procédure stockée étaient extraites d'une fonction SQL.

Comme rien n'avait fonctionné pour moi, j'ai abandonné mes recherches et j'ai créé la classe de convertisseur ci-dessous :

public class NewLineConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var s = string.Empty;

        if (value.IsNotNull())
        {
            s = value.ToString();

            if (s.Contains("\\r\\n"))
                s = s.Replace("\\r\\n", Environment.NewLine);

            if (s.Contains("\\n"))
                s = s.Replace("\\n", Environment.NewLine);

            if (s.Contains("&#x0a;&#x0d;"))
                s = s.Replace("&#x0a;&#x0d;", Environment.NewLine);

            if (s.Contains("&#x0a;"))
                s = s.Replace("&#x0a;", Environment.NewLine);

            if (s.Contains("&#x0d;"))
                s = s.Replace("&#x0d;", Environment.NewLine);

            if (s.Contains("&#10;&#13;"))
                s = s.Replace("&#10;&#13;", Environment.NewLine);

            if (s.Contains("&#10;"))
                s = s.Replace("&#10;", Environment.NewLine);

            if (s.Contains("&#13;"))
                s = s.Replace("&#13;", Environment.NewLine);

            if (s.Contains("<br />"))
                s = s.Replace("<br />", Environment.NewLine);

            if (s.Contains("<LineBreak />"))
                s = s.Replace("<LineBreak />", Environment.NewLine);
        }

        return s;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

J'ai fini par devoir utiliser le Enivornment.NewLine méthode de Réponse de @dparker . J'ai demandé au convertisseur de rechercher toute représentation textuelle possible d'une nouvelle ligne et de la remplacer par Environment.NewLine .

Ça a marché !

Cependant, je restais perplexe quant à la raison pour laquelle aucune des autres méthodes ne fonctionnait avec les propriétés liées aux données.

J'ai laissé un commentaire sur La réponse acceptée de @BobKing :

@BobKing - Cela ne semble pas fonctionner dans le ToolTipService.ToolTip lorsqu'il est lié à un champ dans lequel les retours à la ligne sont intégrés à partir d'un sproc SQL.

Il a répondu par :

@CodeMaverick Si vous liez du texte avec les nouvelles lignes incorporées, elles devraient probablement être des valeurs réelles de char 10 (ou 13) et non des sentinelles XML. C'est seulement si vous voulez écrire de nouvelles lignes littérales dans les fichiers XAML.

Une ampoule s'est allumée !

Je suis allé dans ma fonction SQL, j'ai remplacé mes représentations textuelles des nouvelles lignes par ...

CHAR( 13 ) + CHAR( 10 )

... j'ai retiré le convertisseur de mon TextBlock.Text la liaison, et juste comme ça ... ça a marché !

9voto

Neville Points 233

J'ai trouvé cela utile, mais j'ai rencontré des erreurs en l'ajoutant à une balise "Content=..." dans XAML.

J'avais plusieurs lignes dans le contenu, et j'ai découvert par la suite que le contenu conservait les espaces blancs même si je ne l'avais pas spécifié. Pour contourner ce problème et faire en sorte que le contenu "ignore" les espaces blancs, j'ai implémenté quelque chose comme ceci.

<ToolTip Width="200" Style="{StaticResource ToolTip}" 
         Content="'Text Line 1' 
                   &#x0a;&#x0d;'Text Line 2' 
                   &#x0a;&#x0d;'Text Line 3'"/>

J'espère que cela aidera quelqu'un d'autre.

(La sortie a les trois lignes de texte avec une ligne vide entre chacune).

0 votes

Vous feriez mieux d'essayer <ToolTip><ToolTip.Content><TextBlock Text='.....'/></ToolTip.Content></ToolTip>.

5voto

dparker Points 711

Je réalise que c'est une vieille question mais je voulais juste ajouter que

Environnement.NewLine

fonctionne également si vous le faites par code.

4voto

user829755 Points 752
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

Ce n'est pas qu'il soit important de le savoir, mais ce que vous spécifiez entre les balises TextBlock est appelé contenu en ligne et entre dans la propriété TextBlock.Inlines qui est une InlineCollection et contient des éléments de type Inline. Les sous-classes de Inline sont Run et LineBreak, entre autres. voir TexteBloc.Lignes

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X