2009-09-02 10 views
26

Ich habe diesen RTF-Text:Set RTF-Text in WPF RichTextBox-Steuerelement

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

Wie dieser Text in WPF RichTextBox setzen?


Lösung:

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

Nur 1 Bemerkung tun, sind Sie sicher, dass Sie die ASCII-Kodierung wollen? Es könnte aber UTF8 oder Standard in der Regel sinnvoller sein. –

+0

Ja, im Falle, dass ich habe, ist ASCII-Codierung, was ich verwenden muss. Danke für den Tipp :) –

+0

Eigentlich ** verwenden ** Sie nicht ASCII-Codierung mit diesem Code ... 'Default' bezieht sich eigentlich auf' Encoding.Default', so ist es die Standard-ANSI-Codepage des Systems. Vorsicht vor dem Zugriff auf statische Member über abgeleitete Klassen, es ist oft irreführend. –

Antwort

33

Musst du wirklich mit einem String beginnen?

Eine Methode RTF zu laden, ist dies:

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

Sie wahrscheinlich SelectAll() vor, dass anrufen sollten, wenn Sie vorhandenen Text ersetzen möchten.

Im schlimmsten Fall müssen Sie Ihre Zeichenfolge in einen MemoryStream schreiben und diesen Stream dann der Load() -Methode zuführen. Vergessen Sie nicht die Position = 0 dazwischen.

Aber ich warte darauf, jemanden zu sehen, etwas eleganter zu finden.

+0

rtfBox.Selection.Load ist was ich brauchte. Danke :) –

+8

Anstatt die Eigenschaft 'Selection' zu verwenden und sich Sorgen über den Aufruf von SelectAll zu machen, können Sie wahrscheinlich' new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd) '' verwenden und dann Load auf dem TextRange aufrufen (Auswahl ist selbst eine TextRange). – devios1

+0

mit Deviys Snippet funktioniert das: 'TextRange textRange = neuer TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd); MemoryStream ms = neuer MemoryStream (ASCIIEncoding.ASCII.GetBytes (rtfText)); textRange.Load (ms, DataFormats.Rtf); ' –

-2

einfach RichTextBox.Rtf verwenden:

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

Das funktioniert für die WinForms RichTextBox –

+0

Oh mein Schlechter. Ich habe dich vermisst, wenn du WPF benutzt. –

+0

du hast mir geholfen, melde dich. –

1

Ich schrieb eine wirklich glatte Lösung, indem ich die RichTextBox-Klasse erweiterte, um die Bindung an eine tatsächliche Rich-Text-Datei zu ermöglichen.

Ich bin auf diese Frage/Antwort gestoßen, habe aber nicht wirklich das bekommen, wonach ich gesucht habe, und hoffentlich wird das, was ich gelernt habe, denjenigen helfen, die das in Zukunft lesen.

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

4

eine Erweiterungsmethode erstellen

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

Dann können Sie WinForm-artige Stil

richTextBox1.SetRtf(rtf);

+0

Sie können die Erweiterungsmethode nicht als Eigenschaft verwenden. –