2009-09-02 10 views
26

Tôi có văn bản RTF này:Set RTF văn bản vào WPF RichTextBox kiểm soát

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Arial;}} 
{\colortbl ;\red0\green0\blue0;\red255\green0\blue0;} 
\viewkind4\uc1\pard\qc\cf1\fs16 test \b bold \cf2\b0\i italic\cf0\i0\fs17 
\par } 

Làm thế nào để thiết lập văn bản này vào WPF RichTextBox?


Giải pháp:

public void SetRTFText(string text) 
{ 
    MemoryStream stream = new MemoryStream(ASCIIEncoding.Default.GetBytes(text)); 
    this.mainRTB.Selection.Load(stream, DataFormats.Rtf); 
} 

Thanks for help from Henk Holterman.

+0

Chỉ cần 1 nhận xét, bạn có chắc bạn muốn mã hóa ASCII? Nó có thể là nhưng UTF8 hoặc mặc định thường có ý nghĩa hơn. –

+0

Có, trong trường hợp tôi có, Mã hóa ASCII là những gì tôi cần sử dụng. Thanks for the tip :) –

+0

Trên thực tế, bạn không ** sử dụng mã hóa ASCII với mã này ... 'Default' thực sự đề cập đến' Encoding.Default', do đó, nó là mã ANSI mặc định của hệ thống. Hãy coi chừng việc truy cập các thành viên tĩnh thông qua các lớp dẫn xuất, nó thường gây hiểu nhầm. –

Trả lời

33

Bạn có thực sự phải bắt đầu với một chuỗi?

Một phương pháp để tải RTF là thế này:

rtfBox.Selection.Load(myStream, DataFormats.Rtf); 

Bạn có lẽ nên gọi SelectAll() trước đó nếu bạn muốn thay thế văn bản hiện hành.

Vì vậy, trường hợp xấu nhất, bạn sẽ phải ghi chuỗi của mình vào MemoryStream và sau đó nạp luồng đó vào phương thức Load(). Đừng quên vị trí = 0 ở giữa.

Nhưng tôi đang chờ đợi để xem ai đó tìm ra thứ gì đó thanh lịch hơn.

+0

rtfBox.Selection.Load là những gì tôi cần. Cảm ơn bạn :) –

+8

Thay vì sử dụng thuộc tính 'Selection' và lo lắng về việc gọi SelectAll, bạn có thể sử dụng' new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd) 'và sau đó gọi Load trên TextRange (Selection là chính nó là một TextRange). – devios1

+0

với đoạn trích của devios, điều này hoạt động: 'TextRange textRange = new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd); MemoryStream ms = new MemoryStream (ASCIIEncoding.ASCII.GetBytes (rtfText)); textRange.Load (ms, DataFormats.Rtf); ' –

-2

Đơn giản chỉ cần sử dụng RichTextBox.Rtf:

string rtf = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Arial;}} {\colortbl ;\red0\green0\blue0;\red255\green0\blue0;} \viewkind4\uc1\pard\qc\cf1\fs16 test \b bold \cf2\b0\i italic\cf0\i0\fs17 \par } "; 
richTextBox1.Rtf = rtf; 
+1

Điều đó có tác dụng đối với WinForms RichTextBox –

+0

Ồ tệ hại của tôi. Tôi nhớ bạn, nơi sử dụng WPF. –

+0

bạn trả lời đã giúp tôi, vì vậy hãy bỏ phiếu. –

1

Tôi đã viết một giải pháp thực sự mượt mà bằng cách mở rộng lớp RichTextBox để cho phép Ràng buộc vào một tệp văn bản có định dạng thực sự.

Tôi đã xem qua câu hỏi/trả lời này nhưng không thực sự có được những gì tôi đang tìm kiếm, vì vậy hy vọng những gì tôi đã học sẽ giúp đỡ những người đọc điều này trong tương lai.

Loading a RichTextBox from an RTF file using binding or a RichTextFile control

4

Tạo một phương pháp mở rộng

public static void SetRtf(this RichTextBox rtb, string document) 
    { 
     var documentBytes = Encoding.UTF8.GetBytes(document); 
     using (var reader = new MemoryStream(documentBytes)) 
     { 
      reader.Position = 0; 
      rtb.SelectAll(); 
      rtb.Selection.Load(reader, DataFormats.Rtf); 
     } 
    } 

Sau đó, bạn có thể làm WinForm-esque phong cách

richTextBox1.SetRtf(rtf);

+0

Bạn không thể sử dụng phương thức mở rộng làm thuộc tính. –