2014-09-30 89 views
5

将RTF字符串转换为C#中的XAML字符串的最有效方法是什么?我想使用System.Windows.Documents.XamlRtfConverter.ConvertRtfToXaml(string rtfContent),但不幸的是,课程是内部的。将RTF字符串转换为XAML字符串

+0

什么是Xaml字符串? – 2014-09-30 15:04:12

+1

@MehdiKhademloo阅读[标签维基](http://stackoverflow.com/tags/xaml/info) – 2014-09-30 15:19:48

+0

我知道,但'RTF字符串'相关的'XAML字符串是奇怪的... – 2014-09-30 15:28:21

回答

5

您可以从一个RTF字符串到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 MemoryStream()) 
    { 
     range.Save(outputStream, DataFormats.Xaml); 
     outputStream.Position = 0; 
     using (var xamlStream = new StreamReader(outputStream)) 
     { 
      var xaml = xamlStream.ReadToEnd(); 
      File.WriteAllText(xamlFileName, xaml); 
     } 
    } 
} 

要保留您从RTF串去一个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

使用System.Reflection在System.Windows.Documents中调用内部方法XamlRtfConverter(需要参考PresentationFramework.dll)。 它可以在Parallel.ForEach()中进行数千次转换,而不会发生内存崩溃(与通过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; 
    }