2014-09-30 21 views
5

Jaki jest najskuteczniejszy sposób przekonwertowania ciągu znaków RTF na ciąg znaków XAML w języku C#? Chciałbym użyć System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent), ale niestety ta klasa jest wewnętrzna.Konwertuj ciąg znaków RTF na ciąg XAML

+0

co to jest ciąg "Xaml"? –

+1

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

+0

Wiem to, ale "ciąg XAML" związany z 'ciągiem RTF' jest dla mnie dziwny ... –

Odpowiedz

5

Możesz iść z ciągiem RTF na ciąg XAML ale tracisz obrazów:

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

aby zachować obrazy trzeba iść z ciągiem RTF do pakietu 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

Użyj System.Reflection, aby wywołać metodę wewnętrzną XamlRtfConverter w System.Windows.Documents (wymaga odwołania do PresentationFramework.dll). Działa dla tysięcy konwersji w Parallel.ForEach() bez awarii pamięci (w przeciwieństwie do konwersji za pomocą 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; 
    }