2009-09-02 12 views
26

Mam ten tekst RTF:Zestaw RTF tekst do kontroli WPF RichTextBox

{\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 } 

Jak ustawić ten tekst w WPF RichTextBox?


Rozwiązanie:

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

Tylko 1 uwaga, jesteś pewien, że chcesz kodowanie ASCII? Może być, ale UTF8 lub domyślne zwykle mają więcej sensu. –

+0

Tak, w przypadku, że mam, kodowanie ASCII jest to, czego potrzebuję użyć. Dzięki za cynk :) –

+0

W rzeczywistości, nie ** nie używasz kodowania ASCII z tym kodem ... 'Domyślnie' odnosi się do' Encoding.Default', więc jest to domyślna strona kodowa ANSI systemu. Uważaj na dostęp do statycznych członków poprzez klasy pochodne, często jest to mylące. –

Odpowiedz

33

Czy naprawdę trzeba zacząć z ciągiem?

Jedną z metod, aby załadować RTF to:

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

Prawdopodobnie powinien zadzwonić selectAll() przed, że jeśli chcesz zastąpić istniejący tekst.

Tak więc, najgorszy przypadek, będziesz musiał napisać swój ciąg do MemoryStream, a następnie przekazać ten strumień do metody Load(). Nie zapomnij o pozycji = 0 pomiędzy.

Ale czekam na kogoś, kto wymyśli coś bardziej eleganckiego.

+0

rtfBox.Selection.Load jest tym, czego potrzebowałem. Dziękuję :) –

+8

Zamiast używać właściwości 'Selection' i martwić się wywołaniem SelectAll, prawdopodobnie możesz użyć' new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd) ', a następnie wywołać Load w TextRange (Wybór jest sama TextRange). – devios1

+0

z fragmentem kodu devios, działa to: 'TextRange textRange = new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd); MemoryStream ms = new MemoryStream (ASCIIEncoding.ASCII.GetBytes (rtfText)); textRange.Load (ms, DataFormats.Rtf); ' –

-2

Wystarczy użyć 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

To działa dla WinForms RichTextBox –

+0

Oh my bad. Tęskniłem za tobą, gdy korzystasz z WPF. –

+0

Twoja odpowiedź mi pomogła, więc zagłosuj w górę. –

4

Utwórz metodę rozszerzenia

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

Następnie można zrobić WinForm-owskiej styl

richTextBox1.SetRtf(rtf);

+0

Nie można użyć metody rozszerzenia jako właściwości. –

Powiązane problemy