จะใส่บรรทัดใหม่ลงในตัวควบคุม wpf TextBlock ได้อย่างไร


102

ฉันกำลังดึงข้อความจากไฟล์ XML และฉันต้องการแทรกบรรทัดใหม่ที่ตีความโดยบล็อกข้อความที่แสดงเป็นบรรทัดใหม่

ฉันพยายามแล้ว:

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

แต่ข้อมูลยังคงแสดงโดยไม่ขึ้นบรรทัดใหม่ ฉันตั้งค่าเนื้อหาของ<data>ผ่าน.Textคุณสมบัติผ่าน C #

ฉันต้องใส่อะไรใน XML เพื่อให้แสดงบรรทัดใหม่ใน GUI

ฉันได้ลองตั้งค่าข้อความใน XAML ด้วยตนเองแล้ว:

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

และแม้ว่าอักขระที่เข้ารหัสจะไม่ปรากฏใน GUI แต่ก็ไม่ได้ให้บรรทัดใหม่แก่ฉัน


คุณได้ลองตัดอักขระส่งคืนใน "quotes" <data> Foo bar baz "\ n" baz bar </data>
MethodMan

@DJKRAZE: คำคมทำอะไรไม่ได้ r และ n ด้วยกัน : S
เฉพาะโบลิเวียที่นี่

@BalamBalam: ไม่เหมือนกันคำถามนั้นชัดเจนเกี่ยวกับแอตทริบิวต์ข้อความ
HB

ฉันเข้าใจแล้วว่าทำไม "" ถึงใช้ไม่ได้ในตอนนี้ .. ฉันคิดว่า <LineBreak> น่าจะเหมือนคำตามตัวอักษร / คีย์เวิร์ดมากกว่า ความผิดพลาดของฉัน .. Great answer HB
MethodMan

Dan Vogel สร้างโซลูชันการทำงานที่ทันสมัย WPF ตีความ \ r \ n เป็น \\ r \\ n
zORg Alex

คำตอบ:


174

คุณสามารถลองใส่บรรทัดใหม่ในข้อมูล:

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

หากไม่ได้ผลคุณอาจต้องแยกวิเคราะห์สตริงด้วยตนเอง

หากคุณต้องการ XAML โดยตรงที่ทำได้ง่ายๆ:

<TextBlock>
    Lorem <LineBreak/>
    Ipsum
</TextBlock>

ไม่นี่ก็ไม่ทำอะไรเช่นกัน ฉันได้คัดลอกวางเนื้อหาภายใน XAML ของ TextBlock ด้วยการกด Enter เป็นบรรทัดใหม่และยังคงแสดงพร้อมกัน
เฉพาะโบลิเวียที่นี่

3
@SergioTapia: มีความแตกต่างระหว่างการแบ่งไฟล์ข้อมูลบางไฟล์และ XAML ตัวแยกวิเคราะห์ XAML จะละเว้นช่องว่าง แต่ถ้าคุณยกเลิกXmlSerializerการกำหนดค่าXML บางส่วนโดยใช้ตัวแบ่งจะถูกเก็บไว้ ใน Xaml <LineBreak/>ที่คุณต้องการ
HB

ใส่บรรทัดใหม่โดยตรงในข้อมูล ... แน่นอน! ที่นี่ฉันเพิ่งใช้เวลาส่วนใหญ่ในการลอง \ n, <LineBreak /> และโค้ด html มากมายโดยไม่มีประโยชน์ ฉันควรจะลองวิธีที่ง่ายที่สุดก่อน
thehelix

65

เพื่อความสมบูรณ์: คุณสามารถทำได้ด้วย:

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

x0A คือฟีดบรรทัดเลขฐานสิบหกที่หลบหนี เทียบเท่ากับ \ n


2
มีประโยชน์ในการเชื่อมโยงในสถานการณ์เช่นนี้: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Name: {0} & # x0a; Code: {1}"> <Binding Path = "Name" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet

3
นี่คือคำตอบที่ดีที่สุด
Aurélio Antonio

ฉันจะเพิ่มลิงค์นี้: stackoverflow.com/questions/9021649/…คำอธิบายสำหรับคำตอบ
I.Step

22

คุณยังสามารถใช้การผูก

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

และตั้งค่า MyText ดังนี้:

Public string MyText
{
    get{return string.Format("My Text \n Your Text");}
}

9
คุณไม่จำเป็นต้องใช้สตริงรูปแบบ () ส่งคืน "ข้อความของฉัน \ n ข้อความของคุณ"; ใช้งานได้ดี
Zodman

18

คุณต้องใช้

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

หรือหากคุณต้องการ:

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

ระวัง: ถ้าคุณใช้ & 10 และคุณไปที่บรรทัดถัดไปในข้อความของคุณคุณจะมีสองบรรทัดว่าง

สำหรับรายละเอียดที่นี่: http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

แม้ว่านี่จะเป็นคำถามเก่า แต่ฉันเพิ่งเจอปัญหาและแก้ไขได้แตกต่างจากคำตอบที่ให้มา ไม่แน่ว่าอาจเป็นประโยชน์กับคนอื่น ๆ

ฉันสังเกตว่าแม้ว่าไฟล์ XML ของฉันจะดูเหมือน:

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

เมื่ออ่านเป็นรหัส C # ของฉันสตริงจะมีแบ็กสแลชคู่

\\r\\n

ในการแก้ไขปัญหานี้ฉันเขียน ValueConverter เพื่อดึงแบ็กสแลชพิเศษออก

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

นอกเหนือจากการต้องเพิ่มTextWrapping="Wrap"(และAcceptsReturn="True"ถ้านี่เป็น TextBox) ใน XAML บน TextBlock คุณมีสิทธิ์และนี่ควรเป็นคำตอบ - แต่เพียงแค่บอกว่าให้ทำ.Replace()ตามค่าที่มาจากฐานข้อมูล - ไม่จำเป็นต้องมี ฟังก์ชั่นแฟนซี: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); ค่าใด ๆ ที่ป้อนโดยใช้ปุ่ม Return จะถูกเขียนไปยัง DB ได้ดีนั่นคือเมื่อ C # ได้รับการระงับเพื่อแสดงค่าที่เกิดปัญหาตามที่คุณสังเกต ดังนั้นสิ่งนี้จะต้องเรียกว่า onload ของข้อความ
vapcguy


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>

1

การใช้ System.Environment.NewLine เป็นทางออกเดียวที่เหมาะกับฉัน เมื่อฉันลอง \ r \ n มันก็ทำซ้ำ \ r \ n ในกล่องข้อความ


0

คุณต้องแน่ใจว่า textblock เปิดใช้งานตัวเลือกนี้:

AcceptsReturn="True"

AcceptsReturn ใช้สำหรับ TextBox เท่านั้นไม่ใช่ TextBlock
Steve

0

แทรก "ตัวแบ่งบรรทัด" หรือ "ตัวแบ่งย่อหน้า" ใน RichTextBox "rtb" ดังนี้:

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

วิธีเดียวที่จะได้รับรายการ NewLine คือการแทรกข้อความด้วยรายการ "\ r \ n" ก่อนจากนั้นจึงใช้รหัสเพิ่มเติมซึ่งใช้ได้กับวัตถุ Selection และ / หรือ TextRange เพื่อให้แน่ใจว่ารายการ \ par ถูกแปลงเป็น \ รายการโฆษณาได้รับการบันทึกตามที่ต้องการและยังคงถูกต้องเมื่อเปิดไฟล์ * .Rtf อีกครั้ง นั่นคือสิ่งที่ฉันพบจนถึงตอนนี้หลังจากพยายามอย่างหนัก บรรทัดรหัสสามบรรทัดของฉันต้องล้อมรอบด้วยโค้ดเพิ่มเติม (พร้อมลูป) เพื่อตั้งค่ารายการ TextPointer (.Start .End .ContentStart .ContentEnd) ซึ่ง Lines and Breaks ควรไปซึ่งฉันได้ทำสำเร็จตามวัตถุประสงค์ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.