Newline dalam atribut string

283

Bagaimana saya bisa menambahkan jeda baris ke teks ketika sedang ditetapkan sebagai atribut yaitu:

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

Membaginya ke dalam format yang meledak bukan pilihan untuk situasi khusus saya. Yang saya butuhkan adalah beberapa cara untuk meniru yang berikut ini:

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

Jawaban:

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

Anda dapat menggunakan nilai yang dikodekan secara heksadesimal untuk mewakili literal. Dalam hal ini, saya menggunakan umpan baris (char 10). Jika Anda ingin melakukan "klasik"vbCrLf , maka Anda dapat menggunakannya&#x0d;&#x0a;

Ngomong-ngomong, perhatikan sintaksnya: Ini ampersand, pound, huruf x , lalu nilai hex karakter yang Anda inginkan, dan akhirnya semi-colon.

JUGA: Untuk kelengkapan, Anda dapat mengikat ke teks yang sudah memiliki garis feed tertanam di dalamnya seperti konstan dalam kode Anda di belakang, atau variabel yang dibangun saat runtime.

Bob King
sumber
14
Tampaknya ini tidak berfungsi dalam tag <TextBlock.Text> </ TextBlock.Text>.
kabel
45
Sampai hari ini, saya memiliki 34 suara positif pada jawaban ini, dan saya masih harus kembali dan memeriksa karena sintaksinya sangat kuno.
Bob King
3
Benar. Saya memiliki bookmark ini. Saya harus datang memeriksanya setiap saat.
MojoFilter
4
'Archaic' ==> 'Arcane' :-)
Will Dean
5
Bekerja bahkan di dalam parameter yang mengikat ketika menambahkan garis miring terbalik seperti: ConverterParameter = 'Test \ & # x0a; Text'
Sven
72

Mungkin Anda dapat menggunakan atribut xml: space = "preserve" untuk melestarikan spasi putih di sumber XAML

<TextBlock xml:space="preserve">
Stuff on line 1
Stuff on line 2
</TextBlock>
scrat789
sumber
8
Anda juga dapat menghapus xml: space = "preserve" dan menambahkan <LineBreak /> di antara baris
bergunaBee
5
Harus dicatat (beberapa tahun kemudian) yang xml:space="preserve"juga akan menjaga ruang indentasi, yang biasanya ada di XAML. Jadi eksplisit <LineBreak />seperti yang disarankan di atas tampaknya menjadi solusi yang lebih bersih.
Zeus
Terima kasih! Solusi ini sangat sesuai dengan kode serialisasi berbasis XAML saya.
Seraphim
Oh ini bekerja dengan sempurna. Itu menyelamatkan saya begitu banyak kode pelat ketel. terima kasih
iam.Carrot
57

Ketika Anda perlu melakukannya dalam string (misalnya: di sumber daya Anda), Anda perlu menggunakan xml:space="preserve" dan kode karakter ampersand:

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

Atau baris baru literal dalam teks:

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

Peringatan: jika Anda menulis kode seperti contoh kedua, Anda telah memasukkan baik baris baru, atau carriage return dan baris baru, tergantung pada akhir baris sistem operasi dan / atau editor teks digunakan. Misalnya, jika Anda menulis itu dan komit untuk git dari sistem linux, semuanya mungkin tampak baik - tetapi jika seseorang mengkloningnya ke Windows, git akan mengubah akhir baris Anda ke \r\ndan tergantung pada apa string Anda untuk ... Anda mungkin menghancurkan dunia.

Sadarilah hal itu saat Anda mempertahankan spasi putih. Jika Anda menulis sesuatu seperti ini:

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

Anda sebenarnya telah menambahkan empat jeda baris, mungkin empat carriage-return, dan berpotensi tertinggal di ruang putih yang tidak terlihat ...

Jaykul
sumber
10
BTW, Anda bisa menerapkan xml:space="preserve"atributnya ResourceDictionaryjuga, sehingga Anda tidak perlu menerapkannya ke setiap string sumber daya.
ocodo
1
Tanpa ampersand juga berfungsi. Sesuatu seperti ini: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (dengan jeda baris antara baris Pertama dan baris Kedua)
vgaltes
1
Saya berharap saya bisa memberi Anda +10 untukxml:space="preserve"
TimothyP
1
@ operator Saya baru saja mengeditnya dan diserahkan kepada persetujuan Jaykul / mod. Dan lebih lanjut membangun Jaykul benar-benar menjelaskan detail kecil di sini (karena edit saya tidak memberikan hasil yang diinginkan persis seperti yang diinginkan). Secara keseluruhan saya mengatakan interaksi ini membantu menciptakan jawaban yang lebih baik daripada memposting jawaban saya sendiri.
Anthony Lusardi
21

Anda hanya perlu menghapus <TextBlock.Text>dan hanya menambahkan konten Anda sebagai berikut:

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

masukkan deskripsi gambar di sini

SMMousavi
sumber
Dan pertanyaannya adalah " Bagaimana saya bisa menambahkan jeda baris ke teks ketika sedang ditetapkan sebagai atribut ", atribut, bukan elemen.
mnt
15

Perhatikan bahwa untuk melakukan ini, Anda perlu melakukannya dalam atribut Teks Anda tidak dapat menggunakan konten seperti

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

sumber
12

Mungkin seseorang lebih suka

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

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

LPL
sumber
Meskipun menambahkan & # x0a; tampaknya berfungsi dari XAML, tidak dari kode. Yang ini.
FDF
11

Bagi mereka yang telah mencoba setiap jawaban untuk pertanyaan ini dan masih menggaruk-garuk kepala mengapa tidak ada yang bekerja untuk Anda, Anda mungkin telah berlari ke dalam bentuk masalah yang saya temui.

TextBlock.TextProperti saya ada di dalam ToolTipService.ToolTipelemen dan itu databound ke properti objek yang datanya ditarik dari prosedur tersimpan SQL. Sekarang data dari properti khusus ini dalam prosedur tersimpan diambil dari fungsi SQL.

Karena tidak ada yang berhasil untuk saya, saya berhenti mencari dan membuat kelas konverter di bawah:

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

Saya akhirnya harus menggunakan Enivornment.NewLinemetode dari jawaban @ dparker . Saya menginstruksikan konverter untuk mencari kemungkinan representasi tekstual dari baris baru dan menggantinya dengan Environment.NewLine.

Ini berhasil!

Namun, saya masih bingung mengapa tidak ada metode lain yang bekerja dengan properti databound.

Saya meninggalkan komentar pada jawaban yang diterima @ BobKing :

@ BobKing - Ini sepertinya tidak berfungsi di ToolTipService.ToolTip ketika mengikat ke bidang yang memiliki garis feed tertanam dari SQL sproc.

Dia menjawab dengan:

@CodeMaverick Jika Anda mengikat ke teks dengan baris baru yang disematkan, mereka mungkin harus benar-benar nilai char 10 (atau 13's) dan bukan sentinel XML. Ini hanya jika Anda ingin menulis baris baru secara literal dalam file XAML.

Bola lampu meledak!

Saya masuk ke fungsi SQL saya, menggantikan representasi tekstual dari baris baru dengan ...

CHAR( 13 ) + CHAR( 10 )

... menghapus konverter dari TextBlock.Textikatan saya , dan begitu saja ... itu berhasil!

Code Maverick
sumber
9

Saya telah menemukan ini membantu, tetapi mengalami beberapa kesalahan ketika menambahkannya ke tag "Content = ..." di XAML.

Saya memiliki beberapa baris dalam konten, dan kemudian menemukan bahwa konten itu tetap kosong meskipun saya tidak menentukannya. jadi untuk menyiasatinya dan membiarkannya "mengabaikan" spasi putih, saya menerapkan seperti ini.

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

Semoga ini bisa membantu orang lain.

(Outputnya adalah memiliki tiga baris teks dengan baris kosong di antara masing-masing.)

Neville
sumber
Anda mungkin lebih baik mencoba <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ToolTip>
Simon_Weaver
5

Saya menyadari ini ada pada pertanyaan lama tetapi hanya ingin menambahkan itu

Lingkungan.NewLine

juga berfungsi jika melakukan ini melalui kode.

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

bukan hal yang penting untuk diketahui tetapi apa yang Anda tentukan di antara tag TextBlock disebut konten inline dan masuk ke properti TextBlock.Inlines yang merupakan InlineCollection dan berisi item bertipe Inline. Subclass dari Inline adalah Run dan LineBreak, antara lain. lihat TextBlock.Inlines

pengguna829755
sumber
3

Juga tidak berfungsi

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

Bukan masalah besar, hanya perlu digunakan

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

sebagai gantinya.

Batgar
sumber
1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />
Ahmed Ghoneim
sumber
-1

Kode di balik solusi

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