ขึ้นบรรทัดใหม่ในแอตทริบิวต์สตริง


283

ฉันจะเพิ่มตัวแบ่งบรรทัดเป็นข้อความได้อย่างไรเมื่อตั้งค่าเป็นแอตทริบิวต์เช่น:

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

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

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

คำตอบ:


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

คุณสามารถใช้ค่าที่เข้ารหัสด้วยเลขฐานสิบหกใดก็ได้เพื่อแสดงค่าตามตัวอักษร ในกรณีนี้ฉันใช้ตัวดึงข้อมูลบรรทัด (อักขระ 10 ตัว) ถ้าคุณต้องการที่จะทำ "คลาสสิก"vbCrLfจากนั้นคุณสามารถใช้&#x0d;&#x0a;

โดยวิธีการสังเกตไวยากรณ์: มันเป็นเครื่องหมายแอมเปอร์แซนด์, ปอนด์, ตัวอักษรx , แล้วค่าฐานสิบหกของตัวละครที่คุณต้องการและจากนั้นในที่สุดก็กึ่งลำไส้ใหญ่

นอกจากนี้: เพื่อความสมบูรณ์คุณสามารถผูกกับข้อความที่มีบรรทัดฟีดฝังอยู่ในนั้นเช่นค่าคงที่ในโค้ดของคุณด้านหลังหรือตัวแปรที่สร้างขึ้นในขณะใช้งานจริง


14
เห็นได้ชัดว่าสิ่งนี้ไม่ทำงานใน <TextBlock.Text> </ TextBlock.Text> แท็ก
tcables

45
ณ วันนี้ฉันมีคะแนนโหวต 34 คะแนนสำหรับคำตอบนี้และฉันยังต้องกลับมาตรวจสอบอีกครั้งเพราะไวยากรณ์นั้นล้าสมัย
Bob King

3
อย่างแน่นอน ฉันมีบุ๊คมาร์คนี้แล้ว ฉันต้องตรวจสอบมันตลอดเวลา
MojoFilter

4
'Archaic' ==> 'Arcane' :-)
Will Dean

5
ทำงานได้แม้ในพารามิเตอร์การเชื่อมโยงเมื่อเพิ่มแบ็กสแลชเช่น: ConverterParameter = 'Test \ & # x0a; Text'
Sven

72

อาจเป็นได้ว่าคุณสามารถใช้แอตทริบิวต์ xml: space = "อนุรักษ์" เพื่อรักษาช่องว่างในแหล่ง XAML

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

8
นอกจากนี้คุณยังสามารถลบ xml: space = "
keep

5
ควรสังเกต (ไม่กี่ปีต่อมา) ที่xml:space="preserve"จะให้ช่องว่างเยื้องซึ่งมักจะปรากฏใน XAML ดังนั้นคำ<LineBreak />แนะนำที่ชัดเจนดังกล่าวข้างต้นดูเหมือนจะเป็นวิธีที่สะอาดกว่า
ซุส

ขอบคุณ! โซลูชันนี้เหมาะกับรหัสการทำให้เป็นอนุกรมของ XAML ของฉันได้เป็นอย่างดี
Seraphim

โอ้มันใช้ได้ดีมาก มันช่วยฉันบันทึกรหัสแผ่นหม้อไอน้ำได้มาก ขอบคุณ
iam.Carrot

57

เมื่อคุณต้องการทำในสตริง (เช่น: ในแหล่งข้อมูลของคุณ) คุณต้องใช้xml:space="preserve" และรหัสตัวอักษรเครื่องหมายและตัวอักษร:

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

หรือขึ้นบรรทัดใหม่ตามตัวอักษรในข้อความ:

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

คำเตือน: ถ้าคุณเขียนโค้ดเหมือนตัวอย่างที่สองคุณได้แทรก อย่างใดอย่างหนึ่งขึ้นบรรทัดใหม่หรือกลับรถและขึ้นบรรทัดใหม่ขึ้นอยู่กับปลายสายระบบปฏิบัติการและ / หรือการใช้โปรแกรมแก้ไขข้อความ ตัวอย่างเช่นหากคุณเขียนและส่งไปยัง git จากระบบ linux ทุกอย่างอาจดูดี - แต่ถ้ามีคนโคลนมันเป็น Windows git จะแปลงปลายสายของคุณเป็น\r\nและขึ้นอยู่กับสตริงของคุณ ... อาจทำลายโลก

เพิ่งทราบว่าเมื่อคุณรักษาช่องว่าง ถ้าคุณเขียนอะไรแบบนี้:

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

คุณได้เพิ่มการขึ้นบรรทัดใหม่สี่ครั้งอาจเป็นผลตอบแทนการบินสี่ครั้งและอาจมีพื้นที่สีขาวต่อท้ายที่มองไม่เห็น ...


10
BTW คุณสามารถใช้แอxml:space="preserve"ททริบิวกับResourceDictionaryเกินไปเพื่อที่คุณจะไม่ต้องใช้มันกับทุก ๆ สตริงของทรัพยากร
ocodo

1
หากไม่มีเครื่องหมายและยังใช้งานได้ สิ่งนี้: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (มีตัวแบ่งบรรทัดระหว่างบรรทัดแรกและบรรทัดที่สอง)
vgaltes

1
ฉันหวังว่าฉันจะให้ 10 +10 สำหรับxml:space="preserve"
ธี

1
@trooper ฉันเพิ่งแก้ไขและมันก็เป็นไปตามการอนุมัติของ Jaykul / mod และการสร้างเพิ่มเติมของเจย์กูลทำให้ชัดเจนรายละเอียดเล็กน้อยที่นี่ (เนื่องจากการแก้ไขของฉันไม่ได้ให้ผลลัพธ์ที่ต้องการตามที่ต้องการ) โดยรวมแล้วฉันว่าการโต้ตอบนี้ช่วยสร้างคำตอบที่ดียิ่งขึ้นแทนที่จะโพสต์ของตัวเอง
Anthony Lusardi

21

คุณต้องการเพียงลบ<TextBlock.Text>และเพิ่มเนื้อหาของคุณดังต่อไปนี้:

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

ป้อนคำอธิบายรูปภาพที่นี่


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

15

โปรดทราบว่าในการทำเช่นนี้คุณต้องทำในแอตทริบิวต์ Text คุณไม่สามารถใช้เนื้อหาเช่นนี้ได้

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

12

บางทีมีคนชอบ

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

xmlns:s="clr-namespace:System;assembly=mscorlib"กับ


แม้ว่าการเพิ่ม & # x0a; ดูเหมือนว่าจะทำงานจาก XAML มันไม่ได้มาจากรหัส อันนี้ทำ
FDF

11

สำหรับผู้ที่ได้ลองทุกคำตอบสำหรับคำถามนี้และยังคงเกาหัวของพวกเขาว่าทำไมพวกเขาไม่ทำงานให้คุณคุณอาจพบปัญหาที่ฉันพบ

TextBlock.Textคุณสมบัติของฉันอยู่ภายในToolTipService.ToolTipองค์ประกอบและเป็น databound ไปยังคุณสมบัติของวัตถุที่มีการดึงข้อมูลจากขั้นตอนการจัดเก็บ SQL ตอนนี้ข้อมูลจากคุณสมบัติเฉพาะภายในโพรซีเดอร์ที่เก็บถูกดึงออกมาจากฟังก์ชัน SQL

เนื่องจากไม่มีสิ่งใดที่เหมาะกับฉันฉันจึงเลิกค้นหาและสร้างคลาสตัวแปลงด้านล่าง:

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

ฉันสิ้นสุดขึ้นต้องใช้Enivornment.NewLineวิธีการจากคำตอบของ @ dparker ฉันสั่งให้ตัวแปลงมองหาการแสดงข้อความที่เป็นไปได้ของการขึ้นบรรทัดใหม่และแทนที่ด้วยEnvironment.NewLineที่เป็นไปได้ของการขึ้นบรรทัดใหม่และแทนที่ด้วย

สิ่งนี้ได้ผล!

อย่างไรก็ตามฉันยังคงงงว่าทำไมไม่มีวิธีการอื่นที่ทำงานกับคุณสมบัติของฐานข้อมูล

ฉันแสดงความคิดเห็นในคำตอบที่ยอมรับของ @ BobKing :

@BobKing - ดูเหมือนว่าจะไม่ทำงานใน ToolTipService.ToolTip เมื่อเชื่อมโยงกับเขตข้อมูลที่มีตัวดึงข้อมูลบรรทัดฝังอยู่จาก SQL sproc

เขาตอบด้วย:

@CodeMaverick หากคุณผูกพันกับข้อความที่มีบรรทัดใหม่ฝังอยู่พวกเขาน่าจะเป็นค่า char 10 (หรือ 13's) และไม่ใช่ XML sentinels นี่คือถ้าคุณต้องการเขียนบรรทัดใหม่ตามตัวอักษรในไฟล์ XAML

หลอดไฟดับลง!

ฉันเข้าสู่ฟังก์ชัน SQL ของฉันแทนที่การแสดงข้อความของบรรทัดใหม่ด้วย ...

CHAR( 13 ) + CHAR( 10 )

... นำตัวแปลงออกจากการTextBlock.Textผูกมัดของฉันและเช่นนั้น ... มันใช้ได้!


9

ฉันพบว่ามีประโยชน์นี้ แต่พบข้อผิดพลาดบางอย่างเมื่อเพิ่มลงในแท็ก "เนื้อหา = ... " ใน XAML

ฉันมีเนื้อหาหลายบรรทัดและต่อมาก็พบว่าเนื้อหานั้นรักษาพื้นที่สีขาวแม้ว่าฉันจะไม่ได้ระบุก็ตาม เพื่อที่จะหลีกเลี่ยงสิ่งนั้นและเมื่อมัน "เพิกเฉย" ช่องว่างฉันได้ใช้สิ่งนี้

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

หวังว่านี่จะช่วยคนอื่นได้

(เอาต์พุตมีบรรทัดข้อความสามบรรทัดที่มีบรรทัดว่างอยู่ระหว่างแต่ละบรรทัด)


คุณน่าจะลองดีกว่า <ToolTip> <ToolTip.Content> <TextBlock Text = '..... ' /> </ ToolTip.Content> </ToolTip>
Simon_Weaver

5

ฉันรู้ว่านี่เป็นคำถามเก่า แต่อยากจะเพิ่ม

Environment.NewLine

ยังทำงานได้ถ้าทำผ่านรหัส


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

ไม่ใช่สิ่งสำคัญที่ต้องรู้ แต่สิ่งที่คุณระบุระหว่างแท็ก TextBlock เรียกว่าเนื้อหาแบบอินไลน์และเข้าไปในคุณสมบัติ TextBlock.Inlines ซึ่งเป็น InlineCollection และมีรายการประเภท Inline คลาสย่อยของ Inline คือ Run และ LineBreak และอื่น ๆ ดูTextBlock.Inlines


3

ยังไม่ทำงานกับ

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

ไม่มีเรื่องใหญ่แค่ต้องใช้

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

แทน.



-1

รหัสที่อยู่เบื้องหลังการแก้ปัญหา

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