web-dev-qa-db-fra.com

Newline dans l'attribut de chaîne

Comment puis-je ajouter un saut de ligne au texte quand il est défini comme attribut, à savoir:

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

Le découper dans le format éclaté n'est pas une option pour ma situation particulière. Ce dont j'ai besoin, c'est d'un moyen d'imiter ce qui suit:

<TextBlock>
  <TextBlock.Text>
    Stuff on line1 <LineBreak/>
    Stuff on line2
  </TextBlock.Text>
<TextBlock/>
269
MojoFilter
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

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

À propos, notez la syntaxe: il s'agit de l'esperluette, d'une livre, de la lettre x, de la valeur hexadécimale du caractère souhaité et enfin du point-virgule.

ALSO: Par souci d'exhaustivité, vous pouvez créer une liaison avec un texte contenant déjà les sauts de ligne, comme une constante dans votre code ou une variable construite à l'exécution.

527
Bob King

Peut-être que vous pouvez 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>
67
scrat789

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

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

Ou nouvelles lignes littérales dans le texte:

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

Attention: si vous écrivez du code comme dans le deuxième exemple, vous avez inséré soit une nouvelle ligne, ou un retour à la ligne et une nouvelle ligne, selon la fin de ligne utilisée par votre système d'exploitation et/ou l'éditeur de texte. Par exemple, si vous écrivez cela et que vous le commettez à partir d'un système linux, tout peut sembler correct - mais si quelqu'un le clone sous Windows, git convertira vos fins de ligne en \r\n et en fonction de votre chaîne. car ... vous pourriez briser le monde.

Sachez simplement que lorsque vous préservez des espaces. Si vous écrivez quelque chose comme ceci:

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

Vous avez en fait ajouté quatre sauts de ligne, éventuellement quatre retours à la ligne, et éventuellement des espaces blancs non visibles ...

55
Jaykul

Vous devez simplement supprimer <TextBlock.Text> et ajouter 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

21
S.M.Mousavi

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>
15
Bach Dao

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".

12
LPL

Pour ceux qui ont essayé toutes les réponses à cette question et qui sont toujours en train de se gratter la tête et se demandent pourquoi aucun d’entre eux ne fonctionne pour vous, vous avez peut-être rencontré une forme du problème que j’ai rencontré. dans.

Ma propriété TextBlock.Text se trouvait à l'intérieur d'un élément ToolTipService.ToolTip et était liée à la propriété d'un objet dont les données étaient extraites d'une procédure stockée SQL. Maintenant, 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é ma recherche et 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 la méthode Enivornment.NewLine 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.

Cela a fonctionné!

Cependant, j'étais toujours perplexe quant à la raison pour laquelle aucune des autres méthodes ne fonctionnait avec des propriétés databound.

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

@BobKing - Cela ne semble pas fonctionner dans ToolTipService.ToolTip lors de la liaison à un champ dont les sauts de ligne sont incorporés à partir d'un sproc SQL.

Il a répondu avec:

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

Une ampoule s'est éteinte!

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

CHAR( 13 ) + CHAR( 10 )

... enlevé le convertisseur de ma liaison TextBlock.Text, et juste comme ça ... ça marche!

11
Code Maverick

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

J'avais plusieurs lignes dans le contenu et plus tard, j'ai découvert que le contenu maintenait des espaces, même si je ne l'avais pas précisé. donc pour contourner cela et le laisser "ignorer" les espaces, j'ai implémenté tel que celui-ci.

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

j'espère que ceci aide quelqu'un d'autre.

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

9
Neville

Je me rends compte que c’est une question plus ancienne, mais je voulais juste ajouter que

Environment.NewLine

fonctionne également si cela passe par le code.

3
dparker

Aussi ne fonctionne pas avec

<TextBlock><TextBlock.Text>NO USING ABOVE TECHNIQUE HERE</TextBlock.Text>

Pas grand chose, juste besoin d'utiliser

<TextBlock Text="Cool &#x0a;Newline trick" />

au lieu.

3
Batgar
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

ce n'est pas important de savoir, mais ce que vous spécifiez entre les balises TextBlock est appelé contenu inline et entre dans la propriété TextBlock.Inlines qui est un InlineCollection et contient des éléments de type Inline. Les sous-classes d'Inline sont Run et LineBreak, entre autres. voir TextBlock.Inlines

2
user829755
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />
1
Ahmed Ghoneim