2014-09-30 15 views
5

Wie ist die effizienteste Möglichkeit zum Konvertieren einer RTF-Zeichenfolge in eine XAML-Zeichenfolge in C#? Ich möchte System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent) verwenden, aber leider ist diese Klasse intern.Konvertieren von RTF-Zeichenfolge in XAML-Zeichenfolge

+0

Was ist eine 'Xaml-Zeichenfolge'? –

+1

@MehdiKhademello Lesen Sie das [Tag Wiki] (http://StackOverflow.com/Tags/Xaml/info) –

+0

Ich weiß, dass, aber die 'XAML-Zeichenfolge' in Bezug auf 'RTF-String' ist mir fremd ... –

Antwort

5

Sie können aus einer RTF-Zeichenfolge in einer XAML Zeichenfolge gehen, aber Sie verlieren Bilder:

var rtf = File.ReadAllText(rtfFileName); 
var doc = new FlowDocument(); 
var range = new TextRange(doc.ContentStart, doc.ContentEnd); 
using (var inputStream = new MemoryStream(Encoding.ASCII.GetBytes(rtf))) 
{ 
    range.Load(inputStream, DataFormats.Rtf); 
    using (var outputStream = new MemoryStream()) 
    { 
     range.Save(outputStream, DataFormats.Xaml); 
     outputStream.Position = 0; 
     using (var xamlStream = new StreamReader(outputStream)) 
     { 
      var xaml = xamlStream.ReadToEnd(); 
      File.WriteAllText(xamlFileName, xaml); 
     } 
    } 
} 

Um Bilder zu erhalten Sie von einer RTF-Zeichenfolge in ein XAML-Paket gehen müssen:

var rtf = File.ReadAllText(rtfFileName); 
var doc = new FlowDocument(); 
var range = new TextRange(doc.ContentStart, doc.ContentEnd); 
using (var inputStream = new MemoryStream(Encoding.ASCII.GetBytes(rtf))) 
{ 
    range.Load(inputStream, DataFormats.Rtf); 
    using (var outputStream = new FileStream(xamlFileName, FileMode.Create)) 
    { 
     range.Save(outputStream, DataFormats.XamlPackage); 
    } 
} 
1

Verwenden Sie System.Reflection zum Aufrufen der internen Methode XamlRtfConverter in System.Windows.Documents (benötigt einen Verweis auf PresentationFramework.dll). Es funktioniert für Tausende von Konvertierungen in Parallel.ForEach() ohne Speicherabstürze (im Gegensatz zur Konvertierung über RichTextBox).

private static string ConvertRtfToXaml(string rtfContent) 
    { 
     var assembly = Assembly.GetAssembly(typeof(System.Windows.FrameworkElement)); 
     var xamlRtfConverterType = assembly.GetType("System.Windows.Documents.XamlRtfConverter"); 
     var xamlRtfConverter = Activator.CreateInstance(xamlRtfConverterType, true); 
     var convertRtfToXaml = xamlRtfConverterType.GetMethod("ConvertRtfToXaml", BindingFlags.Instance | BindingFlags.NonPublic); 
     var xamlContent = (string)convertRtfToXaml.Invoke(xamlRtfConverter, new object[] { rtfContent }); 
     return xamlContent; 
    }