297 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/>

587voto

Bob King Points 12913
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

Vous pouvez utiliser n'importe quelle valeur codée en hexadécimal pour représenter un littéral. Dans ce cas, j'ai utilisé le saut de ligne (char 10). Si vous voulez faire du "classique" vbCrLf alors vous pouvez utiliser &#x0d;&#x0a;

Au fait, notez la syntaxe : C'est l'esperluette, une livre, la lettre x puis la valeur hexagonale du caractère que vous voulez, et enfin un point-virgule.

ALSO : Pour être complet, vous pouvez vous lier à un texte dans lequel les retours à la ligne sont déjà intégrés, comme une constante dans votre code ou une variable construite au moment de l'exécution.

15 votes

Apparemment, cela ne fonctionne pas dans les balises <TextBlock.Text></TextBlock.Text>.

52 votes

Au jour d'aujourd'hui, j'ai 34 votes positifs sur cette réponse, et j'ai quand même dû revenir et vérifier parce que la syntaxe est tellement archaïque.

4 votes

Absolument. Je l'ai mis en signet. Je dois venir le consulter tout le temps.

73voto

scrat789 Points 813

Vous pouvez peut-être utiliser l'attribut xml:space="preserve" pour préserver les espaces dans le XAML source.

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>

8 votes

Vous pourriez également supprimer xml:space="preserve" et ajouter <LineBreak /> entre les lignes

5 votes

Il convient de noter (quelques années plus tard) que xml:space="preserve" conservera également les espaces d'indentation, qui sont généralement présents dans le XAML. Ainsi, un <LineBreak /> comme suggéré ci-dessus semble être une solution plus propre.

0 votes

Merci ! Cette solution s'est très bien adaptée à mon code de sérialisation basé sur XAML.

60voto

Jaykul Points 6484

Lorsque vous avez besoin de le faire dans une chaîne de caractères (par exemple, dans vos ressources), vous devez utiliser xml:space="preserve" et les codes des caractères de l'esperluette :

<System:String x:Key="TwoLiner" xml:space="preserve">First line&#10;Second line</System:String>

Ou des retours à la ligne dans le texte :

<System:String x:Key="TwoLiner" xml:space="preserve">First line 
Second line</System:String>

Attention : si vous écrivez du code comme le deuxième exemple, vous avez inséré soit une nouvelle ligne, ou un retour chariot et une nouvelle ligne, en fonction des terminaisons de ligne utilisées par votre système d'exploitation et/ou votre éditeur de texte. Par exemple, si vous écrivez cela et le livrez à git à partir d'un système linux, tout peut sembler correct -- mais si quelqu'un le clone sous Windows, git convertira vos fins de lignes en \r\n et en fonction de ce à quoi sert votre corde... vous pourriez briser le monde.

Il faut en tenir compte lorsque vous préservez les espaces blancs. Si vous écrivez quelque chose comme ça :

<System:String x:Key="TwoLiner" xml:space="preserve">
First line 
Second line 
</System:String>

Vous avez en fait ajouté quatre sauts de ligne, peut-être quatre retours chariot, et potentiellement un espace blanc invisible...

10 votes

D'ailleurs, vous pouvez simplement appliquer le xml:space="preserve" de l'attribut ResourceDictionary également, de sorte que vous n'avez pas besoin de l'appliquer à chaque chaîne de ressources.

1 votes

Sans l'esperluette, ça marche aussi. Quelque chose comme ça : <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (avec un saut de ligne entre la première ligne et la deuxième ligne)

1 votes

J'aimerais pouvoir te donner +10 pour xml:space="preserve"

21voto

S.M.Mousavi Points 704

Il suffit de retirer <TextBlock.Text> et ajoutez simplement votre contenu comme suit :

    <Grid Margin="20">
        <TextBlock TextWrapping="Wrap" TextAlignment="Justify" FontSize="17">
        <Bold FontFamily="Segoe UI Light" FontSize="70">I.R. Iran</Bold><LineBreak/>
        <Span FontSize="35">I</Span>ran or Persia, officially the <Italic>Islamic Republic of Iran</Italic>, 
        is a country in Western Asia. The country is bordered on the 
        north by Armenia, Azerbaijan and Turkmenistan, with Kazakhstan and Russia 
        to the north across the Caspian Sea.<LineBreak/>
        <Span FontSize="10">For more information about Iran see <Hyperlink NavigateUri="http://en.WikiPedia.org/wiki/Iran">WikiPedia</Hyperlink></Span>
            <LineBreak/>
            <LineBreak/>
            <Span FontSize="12">
                <Span>Is this page helpful?</Span>
                <Button Content="No"/>
                <Button Content="Yes"/>
            </Span>
    </TextBlock>
    </Grid>

enter image description here

0 votes

Et la question était " Comment ajouter un saut de ligne au texte lorsqu'il est défini comme un attribut ? ", attribut, pas élément.

15voto

Notez que pour ce faire, vous devez le faire dans l'attribut Text ; vous ne pouvez pas utiliser le contenu tel que

<TextBlock>Stuff on line1&#x0a;Stuff on line 2</TextBlock>

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