Atrybut nowego wiersza


283

Jak dodać podział wiersza do tekstu, gdy jest on ustawiany jako atrybut, tj .:

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

Rozbicie go na rozbity format nie jest opcją dla mojej szczególnej sytuacji. Potrzebuję jakiegoś sposobu naśladowania:

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

Odpowiedzi:


553
<TextBlock Text="Stuff on line1&#x0a;Stuff on line 2"/>

Możesz użyć dowolnej wartości zakodowanej heksadecymalnie do przedstawienia literału. W tym przypadku użyłem przesuwania wiersza (char 10). Jeśli chcesz zrobić „klasyczny” vbCrLf, możesz użyć&#x0d;&#x0a;

Nawiasem mówiąc, zwróć uwagę na składnię: to znak ampersand, funt, litera x , następnie wartość szesnastkowa żądanego znaku, a na końcu średnik.

RÓWNIEŻ: Dla kompletności możesz powiązać z tekstem, który ma już osadzone kanały liniowe jak stała w twoim kodzie lub zmienna skonstruowana w czasie wykonywania.


14
Najwyraźniej nie działa to w tagach <TextBlock.Text> </ TextBlock.Text>.
tcables

45
Na dzień dzisiejszy mam 34 głosy na tę odpowiedź i wciąż musiałem wracać i sprawdzać, ponieważ składnia jest tak archaiczna.
Bob King

3
Absolutnie. Mam tę zakładkę. Muszę cały czas to sprawdzać.
MojoFilter,

4
„Archaic” ==> „Arcane” :-)
Will Dean

5
Działa nawet wewnątrz parametru wiązania podczas dodawania ukośnika odwrotnego, takiego jak: ConverterParameter = 'Test \ & # x0a; Text'
Sven

72

Być może możesz użyć atrybutu xml: space = "preserve" do zachowania białych znaków w źródłowym XAML

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

8
Możesz także usunąć xml: space = "preserve" i dodać między wierszami <LineBreak />
przydatne,

5
Należy zauważyć (kilka lat później), że zachowane xml:space="preserve"zostaną również wcięcia, które zwykle są obecne w XAML. Zatem wyraźne, <LineBreak />jak sugerowano powyżej, wydaje się czystszym rozwiązaniem.
Zeus

Dzięki! To rozwiązanie bardzo dobrze pasuje do mojego kodu serializacji opartego na XAML.
Serafin

Och, to działało idealnie. Zaoszczędziło mi to tak dużo kodu płyty kotła. dzięki
iam.Carrot

57

Gdy musisz to zrobić w postaci ciągu (np .: w swoich zasobach), musisz użyć xml:space="preserve" i znaków znaków handlowego :

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

Lub dosłowne znaki nowej linii w tekście:

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

Ostrzeżenie: jeśli piszesz kod jak w drugim przykładzie włożona albo nowej linii lub powrotu karetki i nowej linii, w zależności od zakończeń linii systemu operacyjnego i / lub tekstu wykorzystania edytora. Na przykład, jeśli napiszesz to i powierzysz to gitowi z systemu Linux, wszystko może wydawać się w porządku - ale jeśli ktoś sklonuje go do systemu Windows, git przekonwertuje zakończenia linii na \r\ni, w zależności od tego, do czego służy twój ciąg ... może rozbić świat.

Pamiętaj o tym, zachowując białe znaki. Jeśli napiszesz coś takiego:

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

Dodałeś cztery podziałki linii, być może cztery znaki powrotu karetki i potencjalnie końcowe białe znaki, które są niewidoczne ...


10
BTW, możesz po prostu zastosować xml:space="preserve"atrybut również do ResourceDictionary, abyś nie musiał stosować go do każdego łańcucha zasobów.
ocodo

1
Bez znaku handlowego również działa. Coś w tym stylu: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (z przerwą między pierwszą linią a drugą linią)
vgaltes

1
Chciałbym dać ci +10 zaxml:space="preserve"
TimothyP

1
@trooper Właśnie dokonałem edycji i pozostawiono ją do zatwierdzenia przez Jaykul / mod. Dalsze kompilacje Jaykul naprawdę wyjaśniły tutaj drobne szczegóły (ponieważ moja edycja nie dała pożądanego wyniku dokładnie tak, jak chciał). Ogólnie rzecz biorąc, powiedziałbym, że ta interakcja pomaga tworzyć jeszcze lepsze odpowiedzi, niż publikowanie własnych.
Anthony Lusardi

21

Musisz po prostu usunąć <TextBlock.Text>i po prostu dodać treść w następujący sposób:

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

wprowadź opis zdjęcia tutaj


Pytanie brzmiało: „ Jak dodać podział wiersza do tekstu, gdy jest on ustawiany jako atrybut ”, atrybut, a nie element.
min.

15

Pamiętaj, że aby to zrobić, musisz to zrobić w atrybucie Tekst, którego nie możesz użyć w treści

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

12

Może ktoś woli

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

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


Mimo dodania & # x0a; wydaje się działać z XAML, nie działa z kodu. Ten robi.
FDF

11

Dla tych, którzy wypróbowali każdą odpowiedź na to pytanie i wciąż drapią się po głowie, dlaczego żadne z nich nie działa dla ciebie, być może natknąłeś się na jakiś problem, na który wpadłem.

Moja TextBlock.Textwłaściwość znajdowała się w ToolTipService.ToolTipelemencie i była połączona z właściwością obiektu, którego dane były pobierane z procedury składowanej SQL. Teraz dane z tej konkretnej właściwości w ramach procedury składowanej były pobierane z funkcji SQL.

Ponieważ nic dla mnie nie zadziałało, zrezygnowałem z wyszukiwania i utworzyłem klasę konwertera poniżej:

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

Skończyło się na tym, że musiałem użyć Enivornment.NewLinemetody z odpowiedzi @ dparker . Poinstruowałem konwerter, aby szukał możliwej reprezentacji tekstowej nowego wiersza i zastąpił go Environment.NewLine.

To działało!

Nadal jednak byłem zakłopotany, dlaczego żadna z pozostałych metod nie działa z właściwościami bazy danych.

Zostawiłem komentarz do zaakceptowanej odpowiedzi @ BobKing :

@BobKing - Wydaje się, że to nie działa w ToolTipService.ToolTip podczas wiązania z polem, które zawiera źródła linii osadzone z sproc SQL.

Odpowiedział:

@CodeMaverick Jeśli wiążesz się z tekstem z osadzonymi nowymi wierszami, prawdopodobnie powinny to być prawdziwe wartości char 10 (lub 13), a nie wartowniki XML. Dzieje się tak tylko wtedy, gdy chcesz pisać dosłownie nowe wiersze w plikach XAML.

Żarówka zgasła!

Przeszedłem do mojej funkcji SQL, zastąpiłem moje reprezentacje tekstowe znaków nowej linii ...

CHAR( 13 ) + CHAR( 10 )

... usunąłem konwerter z mojego TextBlock.Textwiązania i po prostu ... zadziałało!


9

Znalazłem to pomocne, ale napotkałem kilka błędów podczas dodawania go do tagu „Content = ...” w XAML.

Miałem wiele wierszy w treści, a później dowiedziałem się, że treść zawiera białe spacje, chociaż tego nie określiłem. więc aby obejść ten problem i „ignorować” białe znaki, zaimplementowałem takie jak to.

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

mam nadzieję, że to pomaga komuś innemu.

(Dane wyjściowe zawierają trzy linie tekstu z pustą linią pomiędzy nimi.)


być może lepiej wypróbować <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ToolTip>
Simon_Weaver 21.11.11

5

Zdaję sobie sprawę, że dotyczy to starszego pytania, ale chciałem to dodać

Environment.NewLine

działa również, jeśli robi to poprzez kod.


4
<TextBlock>
    Stuff on line1 <LineBreak/>
    Stuff on line2
</TextBlock>

nie jest ważne, aby wiedzieć, ale to, co określasz między znacznikami TextBlock, nazywa się treścią wbudowaną i przechodzi do właściwości TextBlock.Inlines, która jest kolekcją InlineCollection i zawiera elementy typu Inline. Podklasy Inline to między innymi Run i LineBreak. patrz TextBlock.Inlines


3

Też nie działa z

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

Nic wielkiego, wystarczyło użyć

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

zamiast.


1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />

-1

Kod odpowiedzialny za rozwiązanie

private void Button1_Click(object sender, RoutedEventArgs e)
{
    System.Text.StringBuilder myStringBuilder = new System.Text.StringBuilder();
    myStringBuilder.Append("Orange").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Apple").AppendLine();
    myStringBuilder.Append("Banana").AppendLine();
    myStringBuilder.Append("").AppendLine();
    myStringBuilder.Append("Plum").AppendLine();
    TextBox1.Text = myStringBuilder.ToString();
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.