it-swarm.com.de

Zeilenumbruch im Zeichenfolgenattribut

Wie kann ich einem Text einen Zeilenumbruch hinzufügen, wenn er als Attribut festgelegt wird, d. H .:

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

Das Aufteilen in das explodierte Format ist für meine spezielle Situation keine Option. Was ich brauche, ist eine Möglichkeit, das Folgende zu emulieren:

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

Sie können einen beliebigen hexadezimal codierten Wert verwenden, um ein Literal darzustellen. In diesem Fall habe ich den Zeilenvorschub (char 10) verwendet. Wenn Sie "klassisch" vbCrLf machen möchten, können Sie &#x0d;&#x0a;

Beachten Sie übrigens die Syntax: Es ist das kaufmännische Und, ein Pfund, der Buchstabe x, dann der Hexadezimalwert des gewünschten Zeichens und schließlich ein Semikolon.

AUCH: Der Vollständigkeit halber können Sie an einen Text binden, in dem bereits Zeilenumbrüche wie eine Konstante in Ihrem Code oder eine zur Laufzeit erstellte Variable eingebettet sind.

527
Bob King

Möglicherweise können Sie das Attribut xml: space = "preserve" verwenden, um Leerzeichen in der Quell-XAML beizubehalten

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

Wenn Sie es in einer Zeichenfolge tun müssen (z. B. in Ihren Ressourcen), müssen Sie xml:space="preserve"nd das kaufmännische Und-Zeichen:

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

Oder wörtliche Zeilenumbrüche im Text:

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

Warnung: Wenn Sie Code wie im zweiten Beispiel schreiben, haben Sie entweder eine neue Zeile oder einen Zeilenumbruch und eine neue Zeile eingefügt, abhängig von den Zeilenenden, die Ihr Betriebssystem und/oder Ihr Texteditor verwenden. Wenn Sie zum Beispiel das schreiben und es von einem Linux-System an git übergeben, scheint alles in Ordnung zu sein - aber wenn jemand es auf Windows klont, konvertiert git Ihre Zeilenenden in \r\n und je nachdem, wofür deine Saite ist ... könntest du die Welt zerbrechen.

Denken Sie daran, wenn Sie Leerzeichen beibehalten. Wenn du so etwas schreibst:

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

Sie haben tatsächlich vier Zeilenumbrüche, möglicherweise vier Zeilenumbrüche und möglicherweise nachgestellte Leerzeichen hinzugefügt, die unsichtbar sind ...

55
Jaykul

Sie müssen nur <TextBlock.Text> Entfernen und Ihren Inhalt wie folgt hinzufügen:

    <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

Beachten Sie, dass Sie dazu das Attribut Text verwenden müssen, um den Inhalt wie folgt verwenden zu können

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

Vielleicht zieht es jemand vor

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

mit xmlns:s="clr-namespace:System;Assembly=mscorlib".

12
LPL

Für diejenigen, die jede Antwort auf diese Frage ausprobiert haben und immernoch sich am Kopf kratzen, warum keiner von ihnen für Sie arbeitet, könnten Sie auf eine Form des Problems gestoßen sein, auf das ich gestoßen bin.

Meine TextBlock.Text - Eigenschaft befand sich in einem ToolTipService.ToolTip - Element und war an eine Eigenschaft eines Objekts gebunden, dessen Daten aus einer gespeicherten SQL-Prozedur abgerufen wurden. Jetzt wurden die Daten dieser bestimmten Eigenschaft in der gespeicherten Prozedur aus einer SQL-Funktion abgerufen.

Da bei mir nichts funktioniert hatte, gab ich meine Suche auf und erstellte die folgende Konverterklasse:

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

Am Ende musste ich die Methode Enivornment.NewLine Von @ dparkers Antwort verwenden. Ich habe den Konverter angewiesen, nach einer möglichen Textdarstellung einer neuen Zeile zu suchen und diese durch Environment.NewLine Zu ersetzen.

Das hat funktioniert!

Ich war jedoch immer noch ratlos darüber, warum keine der anderen Methoden mit datengebundenen Eigenschaften arbeitete.

Ich habe einen Kommentar hinterlassen zu @ BobKings akzeptierte Antwort :

@BobKing - Dies scheint in ToolTipService.ToolTip nicht zu funktionieren, wenn eine Bindung an ein Feld erfolgt, in das die Zeilenvorschübe aus einem SQL-Sproc eingebettet sind.

Er antwortete mit:

@CodeMaverick Wenn Sie mit den eingebetteten neuen Zeilen an Text binden, sollten diese wahrscheinlich echte Zeichen 10 (oder 13) und nicht die XML-Sentinels sein. Dies ist nur der Fall, wenn Sie in XAML-Dateien wörtliche neue Zeilen schreiben möchten.

Eine Glühbirne ging aus!

Ich ging in meine SQL-Funktion, ersetzte meine Textdarstellungen von Zeilenumbrüchen durch ...

CHAR( 13 ) + CHAR( 10 )

... den Konverter aus meiner TextBlock.Text - Bindung entfernt und einfach so ... es hat funktioniert !

11
Code Maverick

Ich habe dies als hilfreich empfunden, aber beim Hinzufügen zu einem "Content = ..." - Tag in XAML sind einige Fehler aufgetreten.

Ich hatte mehrere Zeilen im Inhalt und stellte später fest, dass der Inhalt Leerzeichen enthielt, obwohl ich das nicht spezifiziert hatte. Um das zu umgehen und das Leerzeichen zu "ignorieren", habe ich so implementiert.

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

hoffe das hilft jemand anderem.

(Die Ausgabe besteht aus drei Textzeilen mit jeweils einer Leerzeile dazwischen.)

9
Neville

Mir ist klar, dass dies eine ältere Frage ist, aber ich wollte das nur hinzufügen

Environment.NewLine

funktioniert auch, wenn dies über Code erfolgt.

3
dparker

Funktioniert auch nicht mit

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

Keine große Sache, muss nur benutzt werden

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

stattdessen.

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

nicht, dass es wichtig ist zu wissen, aber was Sie zwischen den TextBlock-Tags angeben, wird als Inline-Inhalt bezeichnet und in die TextBlock.Inlines-Eigenschaft eingegeben, die eine InlineCollection ist und Elemente des Typs Inline enthält. Unterklassen von Inline sind unter anderem Run und LineBreak. siehe TextBlock.Inlines

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