Bagaimana cara memasukkan baris baru ke dalam kontrol TextBlock wpf?

102

Saya mengambil teks dari file XML, dan saya ingin memasukkan beberapa baris baru yang diinterpretasikan oleh textblock render sebagai baris baru.

Saya sudah mencoba:

<data>Foo bar baz \n baz bar</data>

Namun data tersebut tetap ditampilkan tanpa adanya baris baru. Saya mengatur konten <data>melalui .Textproperti melalui C #.

Apa yang harus saya masukkan ke dalam XML agar dapat membuat baris baru di GUI?

Saya sudah mencoba sesuatu seperti ini secara manual mengatur teks di XAML:

<TextBlock Margin="0 15 0 0" Width="600">
There &#10;
is a new line.
</TextBlock>

Dan sementara karakter yang disandikan tidak muncul di GUI, itu juga tidak memberi saya baris baru.

Hanya Bolivia Di Sini
sumber
Sudahkah
@DJKRAZE: Kutipan tidak melakukan apa-apa, begitu juga dengan r dan n bersama-sama. : S
Hanya Bolivia Di Sini
@BalamBalam: Tidak sama, pertanyaannya adalah kejelasan tentang atribut Text.
HB
Saya mengerti, saya benar-benar mengerti mengapa "" tidak berfungsi sekarang .. Saya berasumsi <LineBreak> akan lebih seperti kata literal / kunci. kesalahan saya .. Jawaban bagus HB
MethodMan
Dan Vogel membuat solusi kerja terkini. WPF menginterpretasikan \ r \ n menjadi \\ r \\ n.
zORg Alex

Jawaban:

174

Anda dapat mencoba meletakkan baris baru di data:

<data>Foo bar baz 
 baz bar</data>

Jika itu tidak berhasil, Anda mungkin perlu mengurai string secara manual.

Kalau butuh direct XAML gampang caranya:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>
HB
sumber
Tidak, ini juga tidak melakukan apa-apa. Saya bahkan telah menyalin konten yang ditempel di dalam XAML dari TextBlock dengan enter sebagai baris baru dan masih menampilkannya sekaligus.
Hanya Bolivia Di Sini
3
@SergioTapia: Ada perbedaan antara memiliki jeda di beberapa file data dan XAML, pengurai XAML mengabaikan spasi, tetapi jika Anda, misalnya, menghapus beberapa XML menggunakan XmlSerializerjeda akan dipertahankan. Dalam XAML yang Anda butuhkan <LineBreak/>.
HB
Letakkan baris baru langsung di data ... tentu saja! Di sini saya menghabiskan banyak waktu untuk mencoba \ n, <LineBreak />, dan banyak kode html tidak berhasil. Saya seharusnya mencoba pendekatan yang paling sederhana dulu.
thehelix
65

Untuk kelengkapan: Anda juga bisa melakukan ini:

 <TextBlock Text="Line1&#x0a;Line 2"/>

x0A adalah Umpan Garis heksadesimal yang lolos. Setara dengan \ n

Ketobomb
sumber
2
Berguna dalam mengikat dalam skenario seperti ini: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Nama: {0} & # x0a; Kode: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet
3
ini adalah jawaban terbaik
Aurélio Antonio
Saya akan menambahkan tautan ini: stackoverflow.com/questions/9021649/… penjelasan untuk jawabannya.
I. Langkah
22

Anda juga bisa menggunakan penjilidan

<TextBlock Text="{Binding MyText}"/>

Dan atur MyText seperti ini:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}
Gordon
sumber
9
Anda bahkan tidak membutuhkan string.Format (). mengembalikan "Teks Saya \ n Teks Anda"; bekerja dengan baik.
Zodman
18

Anda harus menggunakan

 < SomeObject xml:space="preserve" > once upon a time ...
      this line will be below the first one < /SomeObject>

Atau jika Anda lebih suka:

 <SomeObject xml:space="preserve" />  once upon a time... &#10; this line below < / SomeObject>

hati-hati: jika Anda berdua menggunakan & 10 DAN Anda pergi ke baris berikutnya dalam teks Anda, Anda akan memiliki DUA baris kosong.

di sini untuk detailnya: http://msdn.microsoft.com/en-us/library/ms788746.aspx

GameAlchemist
sumber
12

Meskipun ini adalah pertanyaan lama, saya baru saja menemukan masalah dan menyelesaikannya secara berbeda dari jawaban yang diberikan. Mungkin bisa membantu orang lain.

Saya perhatikan bahwa meskipun file XML saya terlihat seperti:

<tag>
 <subTag>content with newline.\r\nto display</subTag>
</tag>

Ketika itu dibaca ke dalam kode C # saya, string itu memiliki garis miring terbalik ganda.

\\r\\n

Untuk memperbaikinya saya menulis ValueConverter untuk menghapus garis miring terbalik ekstra.

public class XmlStringConverter : IValueConverter
{
    public object Convert(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        string valueAsString = value as string;
        if (string.IsNullOrEmpty(valueAsString))
        {
            return value;
        }

        valueAsString = valueAsString.Replace("\\r\\n", "\r\n");
        return valueAsString;
    }

    public object ConvertBack(
        object value,
        Type targetType,
        object parameter,
        CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Dan Vogel
sumber
Seiring dengan harus menambahkan TextWrapping="Wrap"(dan AcceptsReturn="True"jika ini adalah TextBox) di XAML pada TextBlock, Anda sudah benar, dan ini harus menjadi jawabannya - tetapi katakan saja lakukan .Replace()pada nilai yang berasal dari database - tidak perlu fungsi mewah: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); Setiap nilai yang dimasukkan menggunakan tombol Return akan ditulis ke DB dengan baik - saat C # memegangnya untuk menampilkan nilai yang menyebabkan masalah, seperti yang Anda catat. Jadi ini perlu disebut onload teks.
vapcguy
10

Jika semuanya gagal, Anda juga dapat menggunakan

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"
Adrian
sumber
8
<TextBlock Margin="4" TextWrapping="Wrap" FontFamily="Verdana" FontSize="12">
        <Run TextDecorations="StrikeThrough"> Run cannot contain inline</Run>
        <Span FontSize="16"> Span can contain Run or Span or whatever 
            <LineBreak />
        <Bold FontSize="22" FontFamily="Times New Roman" >Bold can contains 
            <Italic>Italic</Italic></Bold></Span>
</TextBlock>
alkk
sumber
1

Menggunakan System.Environment.NewLine adalah satu-satunya solusi yang berhasil untuk saya. Ketika saya mencoba \ r \ n, itu hanya mengulangi \ r \ n yang sebenarnya di kotak teks.

Pesanan23
sumber
0

Anda harus memastikan bahwa textblock mengaktifkan opsi ini:

AcceptsReturn="True"
Dave
sumber
AcceptsReturn hanya untuk TextBox, bukan TextBlock
Steve
0

Sisipkan "baris baru" atau "baris baru" di RichTextBox "rtb" seperti ini:

var range = new TextRange(rtb.SelectionStart, rtb.Selection.End); 
range.Start.Paragraph.ContentStart.InsertLineBreak();
range.Start.Paragraph.ContentStart.InsertParagraphBreak();

Satu-satunya cara untuk mendapatkan item NewLine adalah dengan menyisipkan teks dengan item "\ r \ n" terlebih dahulu, dan kemudian menerapkan lebih banyak kode yang berfungsi pada objek Seleksi dan / atau TextRange. Ini memastikan bahwa item \ par dikonversi ke \ item baris, disimpan sesuai keinginan, dan masih benar saat membuka kembali file * .Rtf. Itulah yang saya temukan sejauh ini setelah usaha keras. Tiga baris kode saya perlu dikelilingi oleh lebih banyak kode (dengan loop) untuk mengatur item TextPointer (.Start .End .ContentStart .ContentEnd) di mana Lines dan Breaks harus pergi, yang telah saya lakukan dengan sukses untuk tujuan saya.

Josh
sumber