2014-09-30 21 views
5

Qual è il modo più efficiente per convertire una stringa RTF in una stringa XAML in C#? Mi piacerebbe usare System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent) ma sfortunatamente quella classe è interna.Converti stringa RTF in stringa XAML

+0

cos'è una stringa Xaml? –

+1

@MehdiKhademloo Leggi il [tag wiki] (http://stackoverflow.com/tags/xaml/info) –

+0

Lo so, ma la 'stringa XAML 'relativa a' stringa RTF' è strana per me ... –

risposta

5

Si può andare da una stringa RTF a una stringa XAML, ma si perde le immagini:

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

per conservare le immagini si deve passare da una stringa RTF a un pacchetto XAML:

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

Utilizzare System.Reflection per richiamare il metodo interno XamlRtfConverter in System.Windows.Documents (deve fare riferimento a PresentationFramework.dll). Funziona per migliaia di conversioni in Parallel.ForEach() senza problemi di memoria (contrariamente alla conversione tramite 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; 
    }