2009-09-02 10 views
26

J'ai ce texte RTF:Set texte RTF en WPF RichTextBox contrôle

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

Comment définir ce texte dans WPF RichTextBox?


Solution:

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

seulement 1 remarque, êtes-vous sûr que vous voulez le codage ASCII? Il pourrait être mais UTF8 ou par défaut habituellement plus de sens. –

+0

Oui, dans le cas où j'ai, l'encodage ASCII est ce que j'ai besoin d'utiliser. Merci pour l'astuce :) –

+0

En fait, vous ** n'utilisez pas ** l'encodage ASCII avec ce code ... 'Default' fait référence à' Encoding.Default', donc c'est la page de code ANSI par défaut du système. Méfiez-vous de l'accès aux membres statiques à travers des classes dérivées, il est souvent trompeur. –

Répondre

33

Avez-vous vraiment commencer par une chaîne?

Une méthode pour charger RTF est la suivante:

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

Vous devriez probablement appeler SelectAll() avant que si vous voulez remplacer le texte existant. Donc, dans le pire des cas, vous devrez écrire votre chaîne dans un MemoryStream, puis envoyer ce flux à la méthode Load(). Ne pas oublier de Position = 0 entre.

Mais j'attends de voir quelqu'un pour trouver quelque chose de plus élégant.

+0

rtfBox.Selection.Load est ce dont j'avais besoin. Merci :) –

+8

Au lieu d'utiliser la propriété 'Selection' et vous soucier d'appeler SelectAll, vous pouvez probablement utiliser' new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd) ', puis appeler Load sur le TextRange (Sélection est lui-même un TextRange). – devios1

+0

avec l'extrait de devios, cela fonctionne: 'TextRange textRange = new TextRange (rtfBox.Document.ContentStart, rtfBox.Document.ContentEnd); MemoryStream ms = nouveau MemoryStream (ASCIIEncoding.ASCII.GetBytes (rtfText)); textRange.Load (ms, DataFormats.Rtf); ' –

-2

utiliser simplement 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

Cela fonctionne pour le WinForms RichTextBox –

+0

Oh mon mauvais. Tu m'as manqué en utilisant WPF. –

+0

votre réponse m'a aidé, alors votez. –

4

Créer une méthode d'extension

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

Ensuite, vous pouvez faire un style WinForm-esque

richTextBox1.SetRtf(rtf);

+0

Vous ne pouvez pas utiliser la méthode d'extension en tant que propriété. –

Questions connexes