WPF Textblock, podział wiersza w atrybucie Text

96

Czy istnieje sposób na \nzrobienie podziału wiersza w TextBlock?

<TextBlock Text="line1\nLine2" />

A może jest lepszy sposób na wymuszenie złamania środkowej linii wewnątrz Textatrybutu?

<LineBreak />

U mnie to nie działa, musi to być wartość Textatrybutu, ponieważ ciąg tekstowy jest ustawiany z zewnętrznego źródła.

Znam, LineBreakale to nie jest odpowiedź, której szukam.

ScottCate
źródło
2
w xaml musisz użyć znaków sterujących <TextBlock Name = "txtBlock" Text = "Line1 & # 10; Line2" />, jeśli chcesz użyć znaku \ n, działa on tylko z kodu za txtBlock.Text = "line1 \ nline2 ";
JJ_Coder4Hire
& # 10; działa dobrze w XAML. Dziękuję JJ_Coder4Hire!
Kay Lee

Odpowiedzi:

116

Wiem, że to przywraca stare pytanie, ale miałem ten sam problem. Rozwiązaniem dla mnie było użycie źródeł wiersza zakodowanych w formacie HTML ( &amp;#10;).

Line1&amp;#10;Line2

Wygląda jak

line1
Line2

Aby uzyskać więcej znaków zakodowanych w HTML, sprawdź w3schools

Noaki
źródło
19
@Knasterbax, jeśli tekst jest określony jako zawartość między <TextBlock>a </TextBlock>potem, tak, będziesz potrzebować <LineBreak/>. &#10;działa wewnątrz Textatrybutu:<TextBlock Text="..." />
Roman Starkov,
6
„& # 10;” pracował dla mnie. Nie potrzebowałem znaku „& amp;” jak już wspomniano. Ta metoda zadziała również podczas ustawiania tekstu w następujący sposób: <Setter Property = "Text" Value = "Line 1 & # 10; & # 10; Line 2" />
EdwardM,
126

Spróbuj tego:

<TextBlock>
    line1
    <LineBreak />
    line2
</TextBlock>
Paul Alexander
źródło
1
Nie próbowałem tego bezpośrednio, ale od razu możesz wypróbować xml: space = "preserve", a następnie bezpośrednio osadzić podział wiersza we właściwości Text.
Paul Alexander
3
Kwestie kapitalizacji. To jest <LineBreak />.
M. Dudley
10

Najłatwiej jest

<TextBlock> blabla <LineBreak /> coucou <LineBreak /> coucou 2 </TextBlock>

Więc po prostu piszesz kod XAML i <LineBreak />ma dokładnie to samo znaczenie
w HTML lub „\ n” w C #.

Stephane Halimi
źródło
1
Zduplikowana odpowiedź dla Paula Alexandra.
vapcguy
5

Co powiesz na rozbicie wiersza na dwa tagi?

<StackPanel>
    <TextBlock Text="Line1" />
    <TextBlock Text="Line2" />
</StackPanel>
Cameron MacFarland
źródło
5

<LineBreak /> nie będzie działać, jeśli znajduje się wewnątrz kolekcji, takiej jak Grid lub StackPanel. W takich przypadkach działałyby następujące elementy:

LineBreak w kolekcji

user2063329
źródło
Wypróbowałem to jako zawartość dla RadioButton. Wydawało się, że wszystko działa dobrze, dopóki nie uruchomiłem programu w systemie Windows 7. W systemie Windows 7 przycisk był wyśrodkowany pionowo między dwiema liniami. System Windows 10 domyślnie ustawia przycisk na górze. Podczas gdy system Windows 10 honorowałby właściwość VerticalContentAlignment, system Windows 7 ją ignoruje. Musiałem skorzystać z rozwiązania LineBreak.
mrfelis
5

Prawidłowy sposób użycia może być następujący:

<TextBlock>  
    <Span>text1</Span>  
    <LineBreak/>  
    <Span>text2</Span>  
</TextBlock>
radu florescu
źródło
3
  <HyperlinkButton 
        Content="Apply and restart this pplication!&#10;&#13;Note that modifying these settings requires the application to be restarted."   />

Prosty sposób CRLF = !&#10;&#13;

!&#10;&#13; - Pracuj nad wszystkimi kontrolkami wpf, xaml, silverlight, takimi jak TextBlock, HyperlinkText i nie tylko

user1551704
źródło
1
(idź popraw swoją drugą odpowiedź i
3

Jeśli wiążesz tekst TextBlock, żadna z pozostałych odpowiedzi nie działa. Po prostu dodaj „\ n” do wiążącego tekstu w miejscu, w którym chcesz przerwać.

Nowy człowiek
źródło
2

To również działa dobrze:

<TextBlock>
    <Run Text="My nice text"/>
    <LineBreak/>
    <LineBreak/>
    <Run Text="After some linebreaks, I'm back!"/>
</TextBlock>
Christoffer Eriksson
źródło
1

po prostu użyj kontrolki AccessText. możesz użyć go jak etykiety i masz właściwość TextWrapping = "WrapWithOverflow"

na przykład.

Mój jest taki i działa dobrze. Ponadto nie masz żadnych problemów z dynamiczną zmianą tekstu.

MelloG
źródło
1

Spóźniłem się na imprezę, ale… tak mniej więcej tak to zrobiłem (pamiętaj, że moje ItemSources to zwykłe ciągi znaków, nie sformatowane i nie musiałem niczego „konwertować”)

public class SpaceToLineBreakConverter : IValueConverter
{   
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {            
        return (!String.IsNullOrEmpty(value as string)) 
        ? new Regex(@"\s").Replace(value as string, "\n") 
        : value;            
    }

    public object ConvertBack(object value, Type targetType, object parameter,System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Dan
źródło
0

Miałem podobny problem i chciałem powiązać ciąg znaczników XAML z TextBlock. Niezbędne do przechowywania deklaratywnego znacznika wewnątrz TextBlock w ciągu do późniejszego użycia.

Oto, jak to zrobiłem : podklasowałem TextBlock, aby umożliwić powiązanie InlineCollection i napisałem Converter między ciągiem a InlineCollection (lub właściwie ogólną listą Inlines.)

Jodrell
źródło
0

to &amp;#10;nie zadziałało dla mnie, kiedy użyłem wiązania. Ale to działa:

$"first line {Environment.NewLine} second line"
Blechdose
źródło