Dòng mới trong thuộc tính chuỗi


283

Làm cách nào tôi có thể thêm ngắt dòng vào văn bản khi nó đang được đặt làm thuộc tính tức là:

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

Phá vỡ nó thành định dạng bùng nổ không phải là một lựa chọn cho tình huống cụ thể của tôi. Những gì tôi cần là một số cách để mô phỏng như sau:

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

Câu trả lời:


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

Bạn có thể sử dụng bất kỳ giá trị được mã hóa hexadecimally để thể hiện bằng chữ. Trong trường hợp này, tôi đã sử dụng nguồn cấp dữ liệu (char 10). Nếu bạn muốn làm "cổ điển" vbCrLf, thì bạn có thể sử dụng&#x0d;&#x0a;

Nhân tiện, lưu ý cú pháp: Đó là ký hiệu, bảng Anh, chữ x , sau đó là giá trị hex của ký tự bạn muốn và cuối cùng là dấu chấm phẩy.

CSONG: Để hoàn thiện, bạn có thể liên kết với một văn bản đã có các nguồn cấp dữ liệu được nhúng trong nó như một hằng số trong mã của bạn phía sau hoặc một biến được xây dựng trong thời gian chạy.


14
Rõ ràng điều này không hoạt động trong Thẻ <TextBlock.Text> </ TextBlock.Text>.
tcables

45
Tính đến hôm nay, tôi có 34 câu trả lời cho câu trả lời này và tôi vẫn phải quay lại và kiểm tra vì cú pháp quá cổ xưa.
Bob King

3
Chắc chắn rồi. Tôi đã đánh dấu này. Tôi phải đến kiểm tra tất cả các thời gian.
MojoFilter

4
'Arch cổ' ==> 'Arcane' :-)
Will Dean

5
Hoạt động ngay cả trong một tham số ràng buộc khi thêm dấu gạch chéo ngược như: ConverterParameter = 'Test \ & # x0a; Text'
Sven

72

Có thể bạn có thể sử dụng thuộc tính xml: space = "reserved" để bảo toàn khoảng trắng trong nguồn XAML

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

8
Bạn cũng có thể xóa xml: space = "
reserved

5
Cần lưu ý (một vài năm sau) xml:space="preserve"cũng sẽ giữ các khoảng trống thụt lề, thường có trong XAML. Do đó, một giải thích rõ ràng <LineBreak />như được đề xuất ở trên dường như là một giải pháp sạch hơn.
Zeus

Cảm ơn! Giải pháp này phù hợp với mã tuần tự hóa dựa trên XAML của tôi rất tốt.
Seraphim

Oh này làm việc hoàn hảo. Nó tiết kiệm cho tôi rất nhiều mã nồi hơi. cảm ơn
iam.Carrot

56

Khi bạn cần thực hiện nó trong một chuỗi (ví dụ: trong tài nguyên của bạn), bạn cần sử dụng xml:space="preserve" mã ký tự: và ký tự:

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

Hoặc những dòng chữ mới trong văn bản:

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

Cảnh báo: nếu bạn viết mã như ví dụ thứ hai, bạn đã chèn hoặc một dòng mới, hoặc một vận chuyển trở lại và xuống dòng, tùy thuộc vào dòng cuối của hệ thống điều hành của bạn và / hoặc văn bản sử dụng biên tập viên. Chẳng hạn, nếu bạn viết nó và cam kết nó với git từ hệ thống linux, mọi thứ có vẻ ổn - nhưng nếu ai đó sao chép nó vào Windows, git sẽ chuyển đổi kết thúc dòng của bạn thành\r\n và tùy thuộc vào chuỗi của bạn dành cho ... bạn có thể phá vỡ thế giới

Chỉ cần lưu ý rằng khi bạn giữ khoảng trắng. Nếu bạn viết một cái gì đó như thế này:

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

Bạn thực sự đã thêm bốn lần ngắt dòng, có thể là bốn lần quay trở lại và có khả năng kéo theo khoảng trắng vô hình ...


10
BTW, bạn chỉ có thể áp dụng xml:space="preserve"thuộc tính cho ResourceDictionaryquá, do đó bạn không cần phải áp dụng nó cho mọi chuỗi tài nguyên.
ocodo

1
Không có dấu và cũng hoạt động. Một cái gì đó như thế này: <System:String x:Key="TwoLiner" xml:space="preserve">First line Second line</System:String> (với một ngắt dòng giữa dòng đầu tiên và dòng thứ hai)
vgaltes 7/07/2015

1
Tôi ước tôi có thể cho bạn +10 choxml:space="preserve"
TimothyP

1
@trooper Tôi mới thực hiện chỉnh sửa và nó được để lại theo sự chấp thuận của Jaykul / mod. Và các bản dựng tiếp theo của Jaykul thực sự đã làm rõ các chi tiết nhỏ ở đây (vì bản chỉnh sửa của tôi không cho đầu ra mong muốn chính xác như mong muốn). Nhìn chung, tôi muốn nói rằng sự tương tác này giúp tạo ra các câu trả lời thậm chí tốt hơn thay vì đăng bài của riêng tôi.
Anthony Lusardi

21

Bạn chỉ cần xóa <TextBlock.Text>và chỉ cần thêm nội dung của bạn như sau:

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

nhập mô tả hình ảnh ở đây


Và câu hỏi là " Làm thế nào tôi có thể thêm ngắt dòng vào văn bản khi nó được đặt làm thuộc tính ", thuộc tính, không phải là phần tử.
phút

15

Lưu ý rằng để làm điều này, bạn cần thực hiện nó trong thuộc tính Text, bạn không thể sử dụng nội dung như

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

12

Có lẽ ai đó thích

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

với xmlns:s="clr-namespace:System;assembly=mscorlib".


Mặc dù thêm & # x0a; dường như hoạt động từ XAML, nó không phải từ mã. Cái này nào.
FDF

11

Đối với những người đã thử mọi câu trả lời cho câu hỏi này và vẫn còn gãi đầu về lý do tại sao không ai trong số họ làm việc cho bạn, bạn có thể đã gặp phải một dạng vấn đề tôi gặp phải.

TextBlock.TextThuộc tính của tôi nằm trong một ToolTipService.ToolTipphần tử và nó là cơ sở dữ liệu cho một thuộc tính của một đối tượng có dữ liệu được lấy từ một thủ tục lưu trữ SQL. Bây giờ dữ liệu từ thuộc tính cụ thể này trong thủ tục được lưu trữ đã được lấy từ hàm SQL.

Vì không có gì làm việc cho tôi, tôi đã từ bỏ tìm kiếm của mình và tạo lớp chuyển đổi bên dưới:

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

Cuối cùng tôi đã phải sử dụng Enivornment.NewLinephương pháp từ câu trả lời của @ dparker . Tôi đã hướng dẫn trình chuyển đổi tìm kiếm bất kỳ biểu diễn văn bản nào có thể có của một dòng mới và thay thế nó bằng Environment.NewLine.

Điều này đã làm việc!

Tuy nhiên, tôi vẫn bối rối về lý do tại sao không có phương thức nào khác làm việc với các thuộc tính cơ sở dữ liệu.

Tôi đã để lại nhận xét về câu trả lời được chấp nhận của @ BobKing :

@BobKing - Điều này dường như không hoạt động trong ToolTipService.ToolTip khi liên kết với một trường có các nguồn cấp dữ liệu được nhúng từ một chuỗi SQL.

Anh trả lời:

@CodeMaverick Nếu bạn liên kết với văn bản với các dòng mới được nhúng, chúng có thể phải là giá trị char 10 thực (hoặc 13) và không phải là các câu lệnh XML. Điều này chỉ khi bạn muốn viết các dòng mới bằng chữ trong các tệp XAML.

Một bóng đèn đã tắt!

Tôi đã đi vào chức năng SQL của mình, thay thế các biểu diễn văn bản của dòng mới bằng ...

CHAR( 13 ) + CHAR( 10 )

... đã gỡ bỏ trình chuyển đổi khỏi TextBlock.Textràng buộc của tôi và cứ như thế ... nó hoạt động!


9

Tôi đã thấy điều này hữu ích, nhưng gặp phải một số lỗi khi thêm nó vào thẻ "Content = ..." trong XAML.

Tôi có nhiều dòng trong nội dung và sau đó phát hiện ra rằng nội dung giữ khoảng trắng mặc dù tôi không chỉ định điều đó. Vì vậy, để giải quyết vấn đề đó và "bỏ qua" khoảng trắng, tôi đã thực hiện như thế này.

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

Hy vọng điều này sẽ giúp người khác.

(Đầu ra có ba dòng văn bản với một dòng trống ở giữa mỗi dòng.)


bạn có thể tốt hơn khi thử <ToolTip> <ToolTip.Content> <TextBlock Text = '.....' /> </ ToolTip.Content> </ ToolTip>
Simon_Weaver

5

Tôi nhận ra đây là câu hỏi cũ hơn nhưng chỉ muốn thêm nó

Môi trường.NewLine

cũng hoạt động nếu làm điều này thông qua mã.


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

không phải là điều quan trọng cần biết nhưng những gì bạn chỉ định giữa các thẻ TextBlock được gọi là nội dung nội tuyến và đi vào thuộc tính TextBlock.Inlines là InlineCollection và chứa các mục thuộc loại Inline. Các lớp con của Inline là Run và LineBreak, trong số những thứ khác. xem TextBlock.Inlines


3

Cũng không làm việc với

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

Không có vấn đề lớn, chỉ cần sử dụng

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

thay thế.


1
<TextBox 
    Name="myTextBox" 
    TextWrapping="Wrap" 
    AcceptsReturn="True" 
    VerticalScrollBarVisibility="Visible" />

-1

Mã đằng sau giải pháp

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();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.