2009-09-02 21 views
26

Ho questo testo RTF:Set RTF testo nel controllo 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 } 

Come impostare questo testo in WPF RichTextBox?


Soluzione:

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

solo 1 osservazione, sei sicuro di voler codifica ASCII? Potrebbe essere ma UTF8 o default di solito hanno più senso. –

+0

Sì, nel caso che ho, la codifica ASCII è ciò che ho bisogno di usare. Grazie per il suggerimento :) –

+0

In realtà, non sei ** utilizzando la codifica ASCII con questo codice ... "Default" si riferisce effettivamente a "Encoding.Default", quindi è la codepage ANSI predefinita del sistema. Attenzione all'accesso ai membri statici tramite classi derivate, è spesso fuorviante. –

risposta

33

Avete davvero iniziare con una stringa?

Un metodo per caricare RTF è questo:

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

Probabilmente dovrebbe chiamare SelectAll() prima che se si desidera sostituire il testo esistente.

Quindi, nel peggiore dei casi, dovrete scrivere la stringa su un MemoryStream e quindi alimentare quel flusso al metodo Load(). Non dimenticare di posizionare = 0 in mezzo.

Ma sto aspettando di vedere qualcuno a inventare qualcosa di più elegante.

+0

rtfBox.Selection.Load è ciò di cui avevo bisogno. Grazie :) –

+8

Invece di usare la proprietà 'Selection' e preoccuparsi di chiamare SelectAll, puoi probabilmente usare' new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd) 'e poi chiamare Load sul TextRange (Selection is stesso un TextRange). – devios1

+0

con lo snippet di devios, questo funziona: 'TextRange textRange = new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd); MemoryStream ms = new MemoryStream (ASCIIEncoding.ASCII.GetBytes (rtfText)); textRange.Load (ms, DataFormats.Rtf); ' –

-2

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

Che funziona per WinForms RichTextBox –

+0

Oh mio male. Mi sei mancato per l'utilizzo di WPF. –

+0

la tua risposta mi ha aiutato, quindi vota. –

4

Creare un metodo di estensione

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

allora si può fare WinForm-esque stile

richTextBox1.SetRtf(rtf);

+0

Non è possibile utilizzare il metodo di estensione come proprietà. –

Problemi correlati