Làm thế nào để đặt một dòng mới vào một điều khiển TextBlock wpf?


101

Tôi đang tìm nạp văn bản từ một tệp XML và tôi muốn chèn một số dòng mới được giải thích bằng cách kết xuất khối văn bản thành các dòng mới.

Tôi đã thử:

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

Nhưng dữ liệu vẫn hiển thị mà không có dòng mới. Tôi đặt nội dung của <data>qua thuộc .Texttính thông qua C #.

Tôi cần đặt gì vào XML để nó hiển thị dòng mới trong GUI?

Tôi đã thử một cái gì đó như thế này để thiết lập văn bản trong XAML theo cách thủ công:

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

Và trong khi ký tự được mã hóa không xuất hiện trong GUI, nó cũng không cung cấp cho tôi một dòng mới.


bạn đã thử gói ký tự trả về trong "dấu ngoặc kép" <data> Foo bar baz "\ n" thanh baz </data>
MethodMan

@DJKRAZE: Trích dẫn không có tác dụng gì, cả r và n cũng vậy. : S
Chỉ có tiếng Bolivia ở đây

@BalamBalam: Nó không giống nhau, câu hỏi đó là sự rõ ràng về thuộc tính Text.
HB

Tôi hiểu rằng tôi hoàn toàn hiểu tại sao "" không hoạt động ngay bây giờ .. Tôi giả định rằng <LineBreak> sẽ giống như một từ khóa / nghĩa đen hơn. sai lầm của tôi .. Câu trả lời tuyệt vời HB
MethodMan

Dan Vogel đã đưa ra một giải pháp làm việc cập nhật. WPF thông dịch \ r \ n thành \\ r \\ n.
zORg Alex

Câu trả lời:


173

Bạn có thể thử đặt một dòng mới trong dữ liệu:

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

Nếu điều đó không hiệu quả, bạn có thể cần phải phân tích cú pháp chuỗi theo cách thủ công.

Nếu bạn cần XAML trực tiếp, thật dễ dàng bằng cách:

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

Không, điều này cũng không làm được gì cả. Tôi thậm chí đã sao chép và dán nội dung bên trong XAML của TextBlock bằng cách nhấn enter làm dòng mới và nó vẫn hiển thị nó cùng một lúc.
Chỉ có tiếng Bolivia ở đây

3
@SergioTapia: Có sự khác biệt giữa việc có dấu ngắt trong một số tệp dữ liệu và XAML, trình phân tích cú pháp XAML bỏ qua khoảng trắng, nhưng nếu bạn, ví dụ, giải mã dữ liệu một số XML bằng cách sử dụng XmlSerializerdấu ngắt sẽ được giữ lại. Trong Xaml bạn cần <LineBreak/>.
HB

Đặt dòng mới trực tiếp trong dữ liệu ... tất nhiên! Ở đây, tôi vừa dành rất nhiều thời gian để thử \ n, <LineBreak /> và hàng tấn mã html nhưng không có kết quả. Tôi nên thử cách tiếp cận đơn giản nhất trước.
thehelix

65

Để hoàn thiện: Bạn cũng có thể làm điều này:

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

x0A là Nguồn cấp dữ liệu dòng thập lục phân đã thoát. Tương đương với \ n


2
Hữu ích trong việc liên kết trong một trường hợp chẳng hạn như sau: - <TextBlock> <TextBlock.Text> <MultiBinding StringFormat = "{} Tên: {0} & # x0a; Mã: {1}"> <Đường dẫn ràng buộc = "Tên" / > <Binding Path = "Code" /> </MultiBinding> </TextBlock.Text> </TextBlock>
rajibdotnet

3
đây là câu trả lời tốt nhất
Aurélio Antonio

Tôi sẽ thêm liên kết này: stackoverflow.com/questions/9021649/… một lời giải thích cho câu trả lời.
I.Bước

22

Bạn cũng có thể sử dụng ràng buộc

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

Và đặt MyText như thế này:

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

9
Bạn thậm chí không cần string.Format (). return "Văn bản của tôi \ n Văn bản của bạn"; hoạt động tốt.
Zodman

18

bạn phải dùng

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

Hoặc nếu bạn thích:

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

hãy chú ý: nếu bạn sử dụng cả & 10 VÀ bạn chuyển đến dòng tiếp theo trong văn bản của mình, bạn sẽ có HAI dòng trống.

tại đây để biết chi tiết: http://msdn.microsoft.com/en-us/library/ms788746.aspx


12

Mặc dù đây là một câu hỏi cũ, nhưng tôi chỉ gặp vấn đề và giải quyết nó khác với các câu trả lời đã cho. Có lẽ nó có thể hữu ích cho người khác.

Tôi nhận thấy rằng mặc dù các tệp XML của tôi trông giống như sau:

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

Khi nó được đọc vào mã C # của tôi, chuỗi có dấu gạch chéo ngược kép.

\\r\\n

Để khắc phục điều này, tôi đã viết một ValueConverter để loại bỏ dấu gạch chéo ngược thừa.

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

Cùng với việc phải thêm TextWrapping="Wrap"(và AcceptsReturn="True"nếu đây là TextBox) trong XAML trên TextBlock, bạn đã đúng và đây sẽ là câu trả lời - nhưng chỉ cần nói làm điều đó .Replace()trên giá trị đến từ cơ sở dữ liệu - không cần hàm ưa thích: valueAsString = valueAsString.Replace("\\r\\n", "\r\n"); Bất kỳ giá trị nào được nhập bằng phím Return sẽ được ghi vào DB tốt - đó là khi C # nắm được nó để hiển thị giá trị mà các vấn đề gây ra, như bạn đã lưu ý. Vì vậy, điều này sẽ cần được gọi là tải văn bản.
vapcguy

10

Nếu vẫn thất bại, bạn cũng có thể sử dụng

"My text needs a line break here" + System.Environment.NewLine + " This should be a new line"

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

Sử dụng System.Enosystem.NewLine là giải pháp duy nhất phù hợp với tôi. Khi tôi thử \ r \ n, nó chỉ lặp lại \ r \ n thực trong hộp văn bản.


0

Bạn phải đảm bảo rằng textblock đã bật tùy chọn này:

AcceptsReturn="True"

AcceptsReturn chỉ dành cho TextBox, không TextBlock
Steve

0

Chèn "ngắt dòng" hoặc "ngắt đoạn" trong RichTextBox "rtb" như sau:

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

Cách duy nhất để lấy các mục NewLine là chèn văn bản với các mục "\ r \ n" trước rồi áp dụng thêm mã hoạt động trên các đối tượng Selection và / hoặc TextRange. Điều này đảm bảo rằng các mục \ par được chuyển đổi thành \ mục hàng, được lưu như mong muốn và vẫn chính xác khi mở lại tệp * .Rtf. Đó là những gì tôi tìm thấy cho đến nay sau những nỗ lực cố gắng. Ba dòng mã của tôi cần được bao quanh bởi nhiều mã hơn (với các vòng lặp) để đặt các mục TextPointer (.Start .End .ContentStart .ContentEnd) nơi các Dòng và Dấu ngắt sẽ đi đến, điều mà tôi đã thực hiện thành công cho mục đích của mình.

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.