2009-09-02 18 views
26

tengo este texto RTF:texto Conjunto RTF en el control RichTextBox WPF

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

Cómo establecer este texto en WPF RichTextBox?


Solución:

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

Sólo 1 comentario, ¿está seguro de que desea la codificación ASCII? Podría ser pero UTF8 o por defecto usualmente tiene más sentido. –

+0

Sí, en caso de que lo tenga, la codificación ASCII es lo que necesito usar. Gracias por la sugerencia :) –

+0

En realidad, no ** usa ** la codificación ASCII con este código ... 'Predeterminado' en realidad se refiere a' Codificación.Default', por lo que es la página de códigos ANSI predeterminada del sistema. Tenga cuidado con el acceso a miembros estáticos a través de clases derivadas, a menudo es engañoso. –

Respuesta

33

¿De verdad tiene que comenzar con una cadena?

Un método para cargar RTF es la siguiente:

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

Probablemente debería llamar Seleccionar Todo() antes de que si desea reemplazar el texto existente.

Por lo tanto, en el peor de los casos, tendrá que escribir su cadena en un MemoryStream y luego alimentar ese flujo al método Load(). No te olvides de Position = 0 en el medio.

Pero estoy esperando a que alguien presente algo más elegante.

+0

rtfBox.Selection.Load es lo que necesitaba. Gracias :) –

+8

En lugar de usar la propiedad 'Selection' y preocuparse por llamar a SelectAll, probablemente pueda usar' new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd) 'y luego invocar Load on the TextRange (La selección es sí mismo un TextRange). – devios1

+0

con el fragmento de devios, esto funciona: 'TextRange textRange = new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd); MemoryStream ms = new MemoryStream (ASCIIEncoding.ASCII.GetBytes (rtfText)); textRange.Load (ms, DataFormats.Rtf); ' –

-2

Utilice simplemente 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

Eso funciona para WinForms RichTextBox –

+0

Oh mi mal. Te extrañé cuando usaste WPF. –

+0

tu respuesta me ayudó, así que vota. –

4

Crear un método de extensión

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

entonces usted puede hacer WinForm-esque estilo

richTextBox1.SetRtf(rtf);

+0

No se puede usar el método de extensión como propiedad. –

Cuestiones relacionadas